MAROON ACADEMY

آموزش نصب SSL رایگان Let’s Encrypt روی Nginx در Ubuntu

راهنمای عملی نصب گواهی رایگان Let’s Encrypt با Certbot روی Nginx در Ubuntu، فعال‌سازی HTTPS، آزمون تمدید خودکار و رفع خطاهای رایج.

امنیت سرور

برای فعال‌کردن HTTPS روی سایتی که با Nginx در Ubuntu میزبانی می‌شود، ساده‌ترین مسیر استفاده از Let’s Encrypt و ابزار رسمی Certbot است. Certbot گواهی را دریافت می‌کند، تنظیمات Nginx را به‌روزرسانی می‌کند و سازوکار تمدید خودکار را در اختیار شما می‌گذارد. در این راهنما تمام مراحل را از بررسی DNS تا آزمون تمدید انجام می‌دهیم.

پیش‌نیازهای نصب SSL

قبل از اجرای Certbot باید دامنه به همین سرور اشاره کند و سایت از طریق HTTP روی پورت 80 در دسترس باشد. همچنین به کاربری با دسترسی sudo، یک پیکربندی فعال Nginx و بازبودن پورت‌های 80 و 443 در فایروال سرور و فایروال شرکت ارائه‌دهنده VPS نیاز دارید.

  • رکورد A دامنه باید به IPv4 سرور و رکورد AAAA، در صورت وجود، به IPv6 فعال همان سرور اشاره کند.
  • دامنه اصلی و زیردامنه www را فقط زمانی در گواهی وارد کنید که هر دو واقعاً به سرور متصل باشند.
  • در تنظیمات Nginx باید server_name درست وجود داشته باشد.
  • پیش از هر تغییر از فایل پیکربندی سایت نسخه پشتیبان بگیرید.

اگر درباره اتصال دامنه مطمئن نیستید، ابتدا راهنمای رکوردهای DNS را بخوانید. برای بررسی سریع IPv4 دامنه می‌توانید دستور زیر را روی رایانه خود یا سرور اجرا کنید:

dig +short A example.com

باید به‌جای example.com دامنه واقعی را وارد کنید. خروجی باید IP عمومی سروری باشد که Nginx روی آن اجرا می‌شود.

مسیر رمزنگاری‌شده HTTPS از مرورگر تا سرور Nginx و چرخه تمدید گواهیگواهی TLS ارتباط مرورگر تا Nginx را رمزنگاری می‌کند و تمدید خودکار از انقضای آن جلوگیری می‌کند.

مرحله اول: بررسی Nginx و فایروال

ابتدا مطمئن شوید پیکربندی فعلی Nginx بدون خطاست. این دستور فایل‌های تنظیمات را بررسی می‌کند و تغییری در سرویس نمی‌دهد:

sudo nginx -t

نتیجه موفق باید شامل پیام‌های syntax is ok و test is successful باشد. اگر خطا دیدید، قبل از ادامه شماره خط و فایل اعلام‌شده را اصلاح کنید. اجرای Certbot روی تنظیمات معیوب ممکن است با شکست روبه‌رو شود.

اگر UFW فعال است و از پروفایل‌های استاندارد Nginx استفاده می‌کنید، دسترسی HTTP و HTTPS را باز کنید:

sudo ufw allow 'Nginx Full'
sudo ufw status

این فرمان را کورکورانه روی سروری با سیاست فایروال اختصاصی اجرا نکنید. اگر پنل ارائه‌دهنده VPS فایروال جداگانه دارد، پورت‌های TCP 80 و 443 را آنجا هم مجاز کنید. پورت 80 برای اعتبارسنجی عادی Certbot لازم است؛ بستن آن پیش از صدور یا تمدید می‌تواند فرایند را متوقف کند.

مرحله دوم: نصب Certbot از Snap

راهنمای رسمی Certbot برای Ubuntu نصب نسخه Snap را پیشنهاد می‌کند. ابتدا بسته‌های سیستم را به‌روزرسانی و Snap را آماده کنید:

sudo apt update
sudo apt install snapd -y
sudo snap install core
sudo snap refresh core

اگر قبلاً Certbot را با apt نصب کرده‌اید، دو نسخه متفاوت را هم‌زمان نگه ندارید. مسیر نسخه فعلی را با دستور زیر ببینید:

command -v certbot

در صورت وجود نسخه بسته سیستم، ابتدا طبق روش مدیریت بسته همان سرور آن را حذف کنید و سپس نسخه Snap را نصب کنید. روی سرور تازه، فرمان‌های زیر Certbot و میانبر اجرایی آن را می‌سازند:

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
certbot --version

اگر فایل /usr/local/bin/certbot از قبل وجود دارد، فرمان ساخت لینک را تکرار نکنید؛ ابتدا بررسی کنید که همان مسیر Snap را هدف گرفته باشد.

مرحله سوم: پشتیبان‌گیری از تنظیمات سایت

نام فایل سایت در سرور شما ممکن است متفاوت باشد. با فرض وجود فایل /etc/nginx/sites-available/example.com یک کپی قابل بازگشت بسازید:

sudo cp /etc/nginx/sites-available/example.com \
  /etc/nginx/sites-available/example.com.before-certbot
sudo nginx -t

در block مربوط به پورت 80 باید دامنه‌های واقعی مشخص باشند. بخش اصلی معمولاً چنین ساختاری دارد؛ مسیر root را با پروژه خود هماهنگ کنید:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /var/www/example.com/public;
}

پس از هر ویرایش، sudo nginx -t را اجرا کنید و فقط در صورت موفقیت از sudo systemctl reload nginx استفاده کنید.

مرحله چهارم: دریافت گواهی و فعال‌کردن HTTPS

اکنون Certbot را با افزونه Nginx اجرا کنید. دامنه‌های فرمان باید دقیقاً با DNS و server_name هماهنگ باشند:

sudo certbot --nginx -d example.com -d www.example.com

Certbot ایمیل تماس و پذیرش شرایط سرویس را می‌پرسد، مالکیت دامنه را از طریق HTTP بررسی می‌کند و سپس گواهی را در تنظیمات Nginx قرار می‌دهد. اگر فقط دامنه بدون www دارید، گزینه دوم -d را حذف کنید. نامی را که هنوز DNS معتبر ندارد به فرمان اضافه نکنید، زیرا می‌تواند کل درخواست را ناموفق کند.

گواهی و کلید خصوصی معمولاً زیر /etc/letsencrypt/live/ نگهداری می‌شوند. دسترسی کلید خصوصی را باز نکنید و فایل‌ها را دستی جابه‌جا نکنید؛ Certbot برای تمدید به همین ساختار وابسته است.

مرحله پنجم: بررسی HTTPS

پس از پایان نصب، هم پیکربندی وب‌سرور و هم پاسخ عمومی سایت را آزمایش کنید:

sudo nginx -t
curl -I https://example.com
sudo certbot certificates

فرمان اول باید موفق باشد، فرمان دوم باید یک پاسخ معتبر HTTP مانند 200 یا redirect مورد انتظار سایت برگرداند و فرمان سوم دامنه‌ها و مسیر گواهی نصب‌شده را نشان می‌دهد. سایت را در مرورگر نیز باز کنید و مطمئن شوید همه منابع صفحه با HTTPS بارگذاری می‌شوند؛ تصویر یا اسکریپت HTTP می‌تواند هشدار mixed content ایجاد کند.

مرحله ششم: آزمون تمدید خودکار

گواهی‌های Let’s Encrypt کوتاه‌عمر هستند، بنابراین تمدید خودکار بخشی ضروری از نصب است. نسخه Snap زمان‌بندی تمدید را ایجاد می‌کند، اما باید آن را با آزمون شبیه‌سازی‌شده کنترل کنید:

sudo certbot renew --dry-run
systemctl list-timers | grep certbot

گزینه --dry-run فرایند تمدید را بدون جایگزین‌کردن گواهی اصلی آزمایش می‌کند. اگر آزمون موفق نبود، آن را نادیده نگیرید؛ DNS، دسترسی پورت 80، تنظیمات Nginx و گزارش خطای Certbot را بررسی کنید. تمدید موفق معمولاً Nginx را نیز برای استفاده از گواهی جدید reload می‌کند.

خطاهای رایج و راه‌حل آن‌ها

خطای Challenge failed

رایج‌ترین علت، اشاره‌کردن DNS به IP اشتباه، بسته‌بودن پورت 80 یا وجود رکورد AAAA نامعتبر است. پاسخ A و AAAA را جداگانه بررسی کنید و مطمئن شوید URL دامنه از بیرون شبکه با HTTP قابل دسترسی است.

Certbot دامنه را در Nginx پیدا نمی‌کند

معمولاً server_name ناقص است یا فایل سایت در sites-enabled فعال نشده. نام دامنه را به block درست اضافه کنید، لینک فعال‌سازی را بررسی کنید و سپس sudo nginx -t و reload را انجام دهید.

حلقه تغییر مسیر پس از فعال‌سازی HTTPS

اگر Cloudflare، load balancer یا reverse proxy جلوی Nginx قرار دارد، حالت SSL پراکسی و تشخیص پروتکل در برنامه را بررسی کنید. redirect هم‌زمان و ناسازگار در چند لایه می‌تواند مرورگر را بین HTTP و HTTPS بچرخاند.

گواهی فقط برای یکی از نام‌ها معتبر است

وجود قفل برای example.com به معنی پوشش خودکار www.example.com نیست. فهرست دامنه‌های گواهی را با sudo certbot certificates ببینید و فقط نام‌هایی را اضافه کنید که DNS آن‌ها آماده است.

چک‌لیست نهایی

  • DNS دامنه و تمام نام‌های داخل گواهی به سرور درست اشاره می‌کنند.
  • پورت‌های 80 و 443 در فایروال سیستم و ارائه‌دهنده باز هستند.
  • آزمون nginx -t موفق و سایت با HTTPS در دسترس است.
  • هیچ منبع mixed content در صفحه وجود ندارد.
  • آزمون certbot renew --dry-run بدون خطا پایان می‌یابد.

جمع‌بندی

برای نصب SSL رایگان روی Nginx، ابتدا DNS و دسترسی HTTP را آماده کنید، Certbot را از Snap نصب کنید، از تنظیمات سایت نسخه پشتیبان بگیرید و فرمان certbot --nginx را با دامنه‌های معتبر اجرا کنید. کار زمانی کامل است که HTTPS، پیکربندی Nginx و تمدید آزمایشی هر سه موفق باشند.

برای ایمن‌سازی بیشتر سرور بعد از فعال‌سازی HTTPS، راهنمای امن‌سازی VPS اوبونتو و برای انتخاب زیرساخت مناسب مقاله VPS چیست و چه تفاوتی با هاست دارد را ببینید.

منابع رسمی: راهنمای رسمی Certbot برای Nginx و Snap، مستندات HTTPS در Nginx و اطلاعیه رسمی Let’s Encrypt درباره گواهی‌های کوتاه‌عمر و تمدید خودکار.