نحوه ایمن سازی Apache با Let’s Encrypt در Ubuntu
۲۹ بهمن ۱۴۰۳
مقدمه
Let’s Encrypt یک مرجع صدور گواهینامه (Certificate Authority – CA) است که روشی ساده برای دریافت و نصب گواهینامههای TLS/SSL فراهم میکند. همچنین این گواهینامه باعث میشود ارتباطات وبسرور از طریق HTTPS رمزگذاری و ایمن شوند. در حال حاضر برای ساده کردن این فرآیند، Let’s Encrypt یک نرمافزار به نام Certbot ارائه داده است که مراحل لازم را بهصورت خودکار انجام میدهد در نتیجه کل فرآیند دریافت و نصب گواهینامه SSL روی Apache و Nginx کاملاً خودکار شده است.
در این آموزش از وبلاگ لیارا، شما یاد خواهید گرفت که چگونه با استفاده از Certbot یک گواهینامه SSL رایگان برای وبسرور Apache در اوبونتو دریافت کنید و آن را بهصورت خودکار تمدید کنید تا نیازی به انجام دستی این کار نباشد. ناگفته نماند که در این آموزش به جای ویرایش فایل پیکربندی پیشفرض آپاچی، از یک فایل میزبان مجازی (Virtual Host) جداگانه برای تنظیم وبسایتی که قرار است با Let’s Encrypt ایمن شود، استفاده میکنیم.
پیش نیازها
برای پیاده سازی این آموزش، به موارد زیر نیاز خواهید داشت:
- یک سرور Ubuntu که شامل یک کاربر غیر root با دسترسی sudo و یک فایروال فعال است، همچنین می توانید راهنمای آموزش راه اندازی سرور در اوبونتو در لیارا را دنبال کنید.
- یک دامنه ثبت شده نیاز دارید که در این آموزش از your_domain به عنوان نام دامنه استفاده خواهد شد. شما می توانید یک دامنه از سایتهایی مانند Namecheap بخرید یا بهصورت رایگان از Freenom بگیرید، یا از هر ثبتکننده دامنه (domain registrar) که میخواهید استفاده کنید.
- تنظیم دو رکورد DNS زیر برای سرور خود، اگر از سامانه مدیریت دامنه لیارا، استفاده میکنید، لطفاً به مستندات DNS آن، مراجعه کنید تا جزئیات مربوط به شیوهی اضافه کردن رکوردها را ببینید.
- یک رکورد A که
your_domain
را به آدرس IP عمومی سرور متصل کند. - یک رکورد A که www.your_domain را به آدرس عمومی سرور متصل کند.
- برای جزئیات نحوه اضافه کردن این رکوردها، لطفا به نحوه تنظیم DNS Server در مستندات لیارا مراجعه کنید.
- یک رکورد A که
- نصب Apache. اگر هنوز وب سرور Apache را نصب نکرده اید، می توانید راهنمای نصب Apache در اوبونتو را مطالعه کنید؛ سپس مطمئن شوید که برای دامنه خود یک فایل میزبان مجازی در Apache ایجاد کرده اید. در این آموزش مسیر فایل
/etc/apache2/sites-available/your_domain.conf
انتخاب شده است.
آنچه در این آموزش میخوانید:
- مرحله اول: نصب Certbot در سرور مجازی Ubuntu
- مرحله دوم: پیکربندی میزبان مجازی آپاچی
- مرحله سوم: اجازه دادن به HTTPS از طریق فایروال
- مرحله چهارم: دریافت گواهی SSL
- مرحله پنجم: بررسی تجدید خودکار Certbot
- نتیجه گیری

مرحله اول: نصب Certbot در سرور مجازی Ubuntu
برای دریافت گواهی SSL از Let’s Encrypt، لازم است نرمافزار Certbot را بر روی سرور خود نصب کنید. شما می توانید برای این کار، از مخازن پیشفرض پکیجهای اوبونتو استفاده کنید.
در شروع کار با دستور زیر فهرست پکیجها را بهروزرسانی کنید:
sudo apt update
پس از آن شما به دو پکیج نیاز دارید: certbot
و python3-certbot-apache
.
پکیج دوم یک افزونه است که Certbot را با Apache یکپارچه میکند و به شما امکان میدهد با یک دستور، بهصورت خودکار گواهی SSL را دریافت کرده و HTTPS را در وب سرور خود پیکربندی کنید:
sudo apt install certbot python3-certbot-apache
در نهایت با فشردن کلید Y
و سپس ENTER
نصب شما تائید و تکمیل می شود.
اکنون Certbot بر روی سرور شما نصب شده است. در مرحله بعد، پیکربندی Apache را بررسی خواهیم کرد تا مطمئن شویم که میزبان مجازی (Virtual Host) بهدرستی تنظیم شده است. این کار تضمین میکند که اسکریپت کلاینت Certbot قادر به شناسایی دامنههای شما بوده و وب سرور شما را بهطور خودکار برای استفاده از گواهی SSL تازه ایجاد شده، پیکربندی کند.
مرحله دوم: پیکربندی میزبان مجازی Apache
برای اینکه Certbot بتواند بهطور خودکار SSL را برای وب سرور شما دریافت و پیکربندی کند، باید میزبان مجازی (Virtual Host) صحیح در فایلهای پیکربندی Apache پیدا شود. نام دامنههای سرور شما از دستورات ServerName و ServerAlias که در بلوک پیکربندی VirtualHost تعریف شدهاند، استخراج میشود.
اگر مراحل تنظیم میزبان مجازی در راهنمای نصب Apache را دنبال کرده باشید، باید یک بلوک VirtualHost برای دامنه خود در فایل /etc/apache2/sites-available/your_domain.conf
داشته باشید که دستورات ServerName
و ServerAlias
به درستی تنظیم شده باشند.
برای اطمینان از این موضوع، فایل میزبان مجازی دامنهتان را با استفاده از nano باز کنید:
sudo nano /etc/apache2/sites-available/your_domain.conf
در این فایل، خطوط مربوط به ServerName
و ServerAlias
را پیدا کنید. این خطوط باید به شکل زیر باشند:
ServerName your_domain
ServerAlias www.your_domain
اگر ServerName و ServerAlias شما به همین شکل تنظیم شدهاند، میتوانید از ویرایشگر خارج شده و به مرحله بعد بروید. در غیر این صورت، پیکربندی میزبان مجازی خود را مطابق با مثال بهروزرسانی کنید. اگر از nano
استفاده میکنید، میتوانید با فشردن CTRL+X
، سپس Y
و در نهایت ENTER
تغییرات خود را ذخیره و از برنامه خارج شوید.
سپس دستور زیر را اجرا کنید تا تغییرات پیکربندی را اعتبارسنجی کنید:
sudo apache2ctl configtest
حالا باید پیام Syntax OK
را دریافت کنید. اگر خطایی مشاهده کردید، دوباره فایل میزبان مجازی را باز کنید و مطمئن شوید اشتباه تایپی و یا کاراکتر ناقص در فایل وجود ندارد. پس از اطمینان از صحت نحوی فایل پیکربندی، Apache را مجدداً بارگذاری کنید تا تغییرات اعمال شوند:
sudo systemctl reload apache2
در نهایت با انجام این تغییرات، Certbot می تواند بلوک VirtualHost صحیح را پیدا کرده و بهروزرسانی کند.
در مرحله بعد، شما فایروال را بهروز میکنید تا ترافیک HTTPS مجاز شود.
مرحله سوم: اجازه دادن به HTTPS از طریق فایروال
اگر فایروال UFW
را طبق راهنماهای قبلی فعال کرده باشید، باید تنظیمات را طوری تغییر دهید که ترافیک HTTPS نیز مجاز شود. خوشبختانه در زمان نصب، آپاچی چند پروفایل مختلف برایUFW
ثبت میکند. شما میتوانید از پروفایل Apache Full استفاده کنید تا ترافیک هر دو نوع HTTP و HTTPS روی سرور شما مجاز شود.
برای دیدن پورتهایی که در حال حاضر مجاز هستند، دستور زیر رو در ترمینال اجرا کنید:
sudo ufw status
اگر طبق راهنمای نصب Apache روی سرور لینوکس عمل کرده باشید، خروجیای شبیه به این دریافت میکنید؛ یعنی در حال حاضر فقط ترافیک HTTP (پورت 80) مجاز است.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache (v6) ALLOW Anywhere (v6)
حالا برای اینکه ترافیک HTTPS مجاز شود، کافیست پروفایل Apache Full را طبق دستور زیر به فایروال اضافه کنید:
sudo ufw allow 'Apache Full'
سپس برای جلوگیری از بروز تداخل، پروفایل قدیمی Apache را حذف کنید:
sudo ufw delete allow 'Apache'
در نهایت برای اطمینان از اعمال تغییرات، مجددا وضعیت فایروال را بررسی کنید:
sudo ufw status
خروجی نهایی باید به صورت زیر باشد:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache Full (v6) ALLOW Anywhere (v6)
حالا که فایروال به درستی تنظیم شد، در مرحله بعد Certbot را اجرا میکنیم تا گواهینامههای SSL را دریافت کنیم.
مرحله چهارم: دریافت گواهی SSL
Certbot روش های متنوعی برای دریافت گواهیهای SSL ارائه می دهد. افزونه Apache بهطور خودکار مسئول پیکربندی مجدد Apache و بارگذاری تنظیمات جدید در مواقع لازم میباشد. برای استفاده از این افزونه، دستور زیر را در ترمینال اجرا کنید:
sudo certbot --apache
هنگام اجرای این دستور چند مورد را از شما خواسته می شود:
یک آدرس ایمیل وارد کنید.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): you@your_domain
این ایمیل برای دریافت هشدارهای امنیتی می باشد. پس از وارد کردن ایمیل، کلیدENTER
رابزنید تا به مرحله بعدی بروید.
با شرایط خدمات، موافقیت کنید.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
در این مرحله، لازم است شرایط استفادهی Let’s Encrypt را مطالعه و تأیید نمایید. برای تأیید، کلید Y
را فشار داده و سپس ENTER
را بزنید.
حالا از شما خواسته میشود دامنههایی که میخواهید برای آنها HTTPS فعال شود را مشخص نمایید. نامهای دامنه بهطور خودکار از تنظیمات Virtual Host در Apache استخراج میشوند؛ بنابراین لازم است اطمینان حاصل کنید که تنظیمات ServerName و ServerAlias به درستی پیکربندی شدهاند.
اگر قصد دارید HTTPS را برای تمامی دامنههای لیستشده فعال کنید، کافی است ورودی را خالی رها کرده و کلید ENTER
را فشار دهید. در غیر این صورت، شمارههای مربوط به دامنههای مورد نظر را وارد نمایید.
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: your_domain
2: www.your_domain
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):
در آخر بعد از اتمام مراحل بالا، پیکربندی Certbot تکمیل می شود و پیام نهایی مربوط به دریافت گواهی جدید را مشاهده می کنید. در این پیام فایلهای گواهی و کلید خصوصی، تاریخ انقضا و اطلاعات مربوط به فرآیند تمدید خودکار ارائه می شود.
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-07-10.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for your_domain to /etc/apache2/sites-available/your_domain-le-ssl.conf
Successfully deployed certificate for www.your_domain.com to /etc/apache2/sites-available/your_domain-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https:/your_domain and https://www.your_domain.com
اکنون گواهی شما در تنظیمات Apache نصب و بارگذاری شدند. برای ارزیابی امنیت سرور خود، میتوانید از تست SSL Labs استفاده کنید. این تست معمولاً امتیاز A را به گواهینامههای صحیح اختصاص میدهد. در مرحله بعد، فرایند تمدید خودکار گواهینامه را آزمایش میکنیم.
مرحله پنجم: نحوه تایید تمدید خودکار Certbot
گواهیهای Let’s Encrypt تنها ۹۰ روز اعتبار دارند. این محدودیت، کاربران را به خودکارسازی روند تمدید گواهی و همچنین تضمین انقضای سریعتر گواهیهای سواستفاده شده یا کلیدهای سرقتشده تشویق می کند. بسته certbot که نصب کردهایم، روند تمدید گواهیها را بهطور خودکار مدیریت میکند؛ یرا یک اسکریپت تمدید در مسیر /etc/cron.d
قرار داده شده است که توسط یک سرویس systemctl
به نام certbot.timer
کنترل میشود. این اسکریپت دو بار در روز اجرا شده و بهطور خودکار هر گواهی که کمتر از سی روز تا انقضا باقی مانده باشد را تمدید میکند.
برای بررسی وضعیت این سرویس و اطمینان از فعال بودن آن، دستور زیر را اجرا نمایید:
sudo systemctl status certbot.timer
خروجی شما باید مشابه نمونه زیر باشد:
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Mon 2022-04-11 20:52:46 UTC; 4min 3s ago
Trigger: Tue 2022-04-12 00:56:55 UTC; 4h 0min left
Triggers: ● certbot.service
Apr 11 20:52:46 jammy-encrypt systemd[1]: Started Run certbot twice daily.
برای اطمینان از اینکه تمدید خودکار گواهینامه بهدرستی کار میکند، دستور زیر را بزنید:
sudo certbot renew --dry-run
اگر دستور بدون خطا اجرا شود، خروجی مشابه زیر خواهید داشت:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/your_domain.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Account registered.
Simulating renewal of an existing certificate for your_domain and www.your_domain.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/your_domain/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
اکنون، تنظیمات شما به درستی انجام شده است. در مواقع لازم، Certbot بهطور خودکار گواهیهای شما را تمدید کرده و Apache را برای اعمال تغییرات مجدداً بارگذاری خواهد کرد. در صورت بروز مشکل در روند تمدید خودکار، Let’s Encrypt از طریق ایمیلی که مشخص کردهاید، هشدار مربوط به نزدیک شدن تاریخ انقضا را ارسال خواهد کرد.
نتیجه گیری
در این آموزش، شما مراحل زیر را انجام دادید:
- نصب Certbot در سرور مجازی Ubuntu
- پیکربندی میزبان مجازی آپاچی
- اجازه دادن به HTTPS از طریق فایروال
- دریافت گواهی SSL
- بررسی تجدید خودکار Certbot
اکنون کلاینت Let’s Encrypt به نام certbot را نصب کردید، گواهی SSL را برای دامنه خود پیکربندی و نصب کردید و اگر سؤالی درباره استفاده از Certbot دارید، مستندات رسمی Let’s Encrypt یک منبع عالی برای شروع است.