پیکوسیستم خدمات فنی IT

نصب SSL روی سرور: گواهی Let’s Encrypt در Nginx و Apache، تمدید و عیب یابی

نصب SSL روی سرور با گواهی رایگان Let's Encrypt و ابزار Certbot، برای Nginx و Apache. انواع گواهی، تمدید خودکار، ریدایرکت به HTTPS، تست تنظیمات و خطاهایی که بعد از نصب پیش می آیند.

نصب SSL روی سرور: گواهی Let's Encrypt در Nginx و Apache، تمدید و عیب یابی

نصب SSL روی سرور سه کار دارد: گرفتن گواهی برای دامنه، معرفی آن به وب سرور، و ریدایرکت کردن کاربران از HTTP به HTTPS. با گواهی رایگان Let’s Encrypt و ابزار Certbot، هر سه در چند دقیقه روی سرور لینوکس انجام می شود. از این به بعد ارتباط مرورگر با سایت رمز می شود و مرورگر آیکن قفل را نشان می دهد، به جای هشدار «ناامن».

نامی که همه می گویند SSL، امروز TLS است. SSL نام پروتکل قدیمی ای است که دیگر امن نیست و نسخه های TLS 1.2 و 1.3 جایش را گرفته اند، اما نام «گواهی SSL» همچنان رایج مانده است.

انواع گواهی

نوع چه چیزی را تأیید می کند کاربرد
DV (Domain Validation) فقط اینکه شما صاحب دامنه اید سایت شرکتی، وبلاگ، API؛ Let’s Encrypt از این نوع است
OV (Organization Validation) دامنه و ثبت شرکت سایت هایی که می خواهند نام سازمان در گواهی باشد
EV (Extended Validation) بررسی کامل تر شرکت کاربرد کمتر از قبل؛ مرورگرها دیگر نوار سبز نشان نمی دهند
Wildcard همه زیردامنه ها، مثل *.example.com وقتی زیردامنه زیاد دارید

برای بیشتر سایت های شرکتی، DV کافی است. رمزگذاری در همه نوع ها یکسان است و تفاوت فقط در اعتبارسنجی هویت است. Wildcard در Let’s Encrypt فقط با تأیید DNS-01 (اضافه کردن یک رکورد TXT) صادر می شود.

پیش نیازها

  • رکورد A دامنه به IP همین سرور اشاره کند (DNS چیست را ببینید).
  • پورت 80 و 443 روی فایروال سرور و فایروال شبکه باز باشد. Let’s Encrypt برای تأیید از پورت 80 استفاده می کند.
  • وب سرور (Nginx یا Apache) نصب باشد و سایت با HTTP باز شود.

نصب Certbot و دریافت گواهی

روی اوبونتو، Certbot از مخزن رسمی یا snap نصب می شود:

sudo apt update
sudo apt install certbot python3-certbot-nginx

برای Nginx، گواهی گرفتن و تنظیم خودکار سایت:

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

در Apache افزونه دیگری لازم است:

sudo apt install python3-certbot-apache
sudo certbot --apache -d example.com -d www.example.com

Certbot ایمیل شما را می پرسد (برای اطلاعیه های مهم حساب؛ Let’s Encrypt دیگر برای نزدیک شدن انقضا ایمیل نمی فرستد و پایش انقضا با خود شماست)، شرایط را تأیید می کند و می پرسد HTTP به HTTPS ریدایرکت شود یا نه. گزینه ریدایرکت را بپذیرید. اگر نمی خواهید Certbot فایل تنظیمات را تغییر دهد، فقط گواهی را بگیرید و خودتان به تنظیمات اضافه کنید:

sudo certbot certonly --webroot -w /var/www/html -d example.com

فایل های گواهی در پوشه /etc/letsencrypt/live/example.com/ می مانند: fullchain.pem برای گواهی و زنجیره، و privkey.pem برای کلید خصوصی. کلید خصوصی را به هیچ کس ندهید و از آن بکاپ مطمئن بگیرید.

تنظیم دستی در Nginx

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    http2 on;
    server_name example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    # بقیه تنظیمات سایت
}

بعد از ویرایش، تنظیمات را بدون قطع سرویس تست و اعمال کنید:

sudo nginx -t && sudo systemctl reload nginx

خط http2 on در نسخه های جدید Nginx (1.25.1 به بعد) جای گزینه قدیمی listen 443 ssl http2 را گرفته است.

تمدید خودکار

گواهی Let’s Encrypt فقط 90 روز اعتبار دارد. Certbot هنگام نصب یک تایمر systemd یا کرون برای تمدید می سازد. تست کنید که تمدید واقعاً کار می کند:

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

اگر dry-run خطا داد، بیشتر وقت ها به خاطر بسته بودن پورت 80، تغییر IP دامنه یا ریدایرکتی است که مسیر /.well-known/acme-challenge/ را می بندد. بعد از تمدید موفق، وب سرور باید گواهی جدید را بخواند؛ با --deploy-hook "systemctl reload nginx" این کار خودکار می شود. گزارش انقضای گواهی را به مانیتورینگ هم بدهید تا قبل از تمام شدن گواهی خبردار شوید.

مشکل های بعد از نصب

  • mixed content: صفحه با HTTPS باز می شود ولی عکس یا اسکریپت با آدرس http:// بارگذاری می شود و مرورگر آن را می بندد. در وردپرس آدرس سایت را در تنظیمات به https تغییر دهید و آدرس های قدیمی دیتابیس را اصلاح کنید.
  • خطای ERR_CERT_COMMON_NAME_INVALID: گواهی برای نام دیگری صادر شده. همه نام هایی که کاربر تایپ می کند (با www و بدون www) باید در گواهی باشند.
  • خطای زنجیره ناقص: روی بعضی دستگاه ها گواهی معتبر نیست چون فایل زنجیره (intermediate) معرفی نشده. به جای cert.pem از fullchain.pem استفاده کنید.
  • ساعت سرور اشتباه است و گواهی «هنوز معتبر نیست» یا «منقضی شده» دیده می شود.
  • سایت پشت CDN است و تنظیم SSL آن روی حالت Flexible مانده، که ارتباط CDN تا سرور بدون رمز می ماند و گاهی باعث حلقه ریدایرکت می شود.

برای بررسی گواهی از بیرون، از خود سرور هم می شود استفاده کرد:

openssl s_client -connect example.com:443 -servername example.com < /dev/null | openssl x509 -noout -dates -subject

امنیت بیشتر بعد از نصب

  • فقط TLS 1.2 و 1.3 را فعال بگذارید.
  • HSTS را بعد از اطمینان از درست کار کردن HTTPS فعال کنید، چون بعد از آن مرورگر هیچ وقت HTTP را قبول نمی کند.
  • در کنترل پنل هایی مثل cPanel و DirectAdmin گواهی رایگان با AutoSSL یا Let’s Encrypt داخلی هم نصب می شود و لازم نیست Certbot دستی اجرا کنید.

نصب گواهی در Apache به صورت دستی

اگر Apache دارید و نمی خواهید Certbot فایل ها را تغییر دهد، گواهی را با certonly بگیرید و در virtual host معرفی کنید:

<VirtualHost *:443>
    ServerName example.com
    DocumentRoot /var/www/example.com
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
sudo a2enmod ssl
sudo apache2ctl configtest && sudo systemctl reload apache2

گواهی Wildcard

گواهی wildcard یک بار برای *.example.com صادر می شود و همه زیردامنه ها را می پوشاند. Let’s Encrypt این نوع را فقط با تأیید DNS-01 می دهد، یعنی باید یک رکورد TXT با نام _acme-challenge در DNS بسازید:

sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.com

روش دستی تمدید خودکار ندارد. برای تمدید بدون دخالت، از افزونه DNS سرویس DNS خود (مثل Cloudflare) یا اسکریپت hook استفاده کنید. اگر فقط چند زیردامنه دارید، گواهی جدا برای هرکدام ساده تر و امن تر از wildcard است، چون لو رفتن کلید wildcard همه زیردامنه ها را به خطر می اندازد.

گواهی برای سرویس هایی غیر از وب

گواهی فقط برای سایت نیست. سرور ایمیل (Postfix و Dovecot)، VPN و پنل های مدیریتی هم از همان گواهی استفاده می کنند. فایل fullchain.pem و privkey.pem را به تنظیمات آن سرویس بدهید و بعد از هر تمدید سرویس را reload کنید. مشکل رایج این است که وب سرور گواهی جدید را دارد ولی سرور ایمیل هنوز نسخه قدیمی را نشان می دهد و کاربران ایمیل خطای گواهی می گیرند.

تست کیفیت پیکربندی SSL

بعد از نصب، سرویس رایگان SSL Labs (به آدرس ssllabs.com/ssltest) تنظیمات شما را نمره می دهد و ضعف ها را نشان می دهد: پروتکل قدیمی، زنجیره ناقص، نبودن HSTS. نمره A برای بیشتر سایت ها هدف خوبی است. با دستور زیر هم می شود از خود سرور تاریخ انقضا را دید:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate

وقتی Let’s Encrypt کافی نیست

گواهی های پولی (OV و EV) وقتی لازم می شوند که سازمان یا پیمانکار به نام شرکت در گواهی نیاز دارد یا قرارداد بیمه و مقررات خاص دارید. برای سرورهای داخلی که از اینترنت دیده نمی شوند، گواهی Let’s Encrypt قابل صدور نیست چون نیاز به تأیید از بیرون دارد؛ برای آن ها یا از DNS-01 استفاده کنید یا یک CA داخلی (مثل Active Directory Certificate Services) بسازید.

HSTS و ریدایرکت

ریدایرکت از HTTP به HTTPS یک بار است، ولی هدر HSTS به مرورگر می گوید از این به بعد این دامنه را فقط با HTTPS باز کند، حتی اگر کاربر http بنویسد:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

مقدار max-age به ثانیه است و یک سال معمول است. قبل از فعال کردن مطمئن شوید همه زیردامنه ها HTTPS دارند، چون includeSubDomains آن ها را هم اجباری می کند و بازگشت از آن تا پایان مدت ممکن نیست. اول با max-age کوچک (مثلاً 300) تست کنید و بعد بالا ببرید.

بررسی بعد از هر تمدید

تمدید خودکار فقط تا وقتی خوب است که کار کند. بعد از تغییر سرور، تغییر فایروال یا ریدایرکت جدید، sudo certbot renew --dry-run را دوباره اجرا کنید. یک بررسی بیرونی انقضا هم در مانیتورینگ بگذارید که 14 روز مانده به پایان گواهی هشدار بدهد؛ این کار بهتر از اینکه کاربران خطای قرمز مرورگر را ببینند و به شما خبر بدهند.

در کنار گواهی TLS می توان از فایروال برنامه وب هم استفاده کرد.

پایان دادن به TLS روی پراکسی در ریورس پراکسی Nginx توضیح داده شده است.

منابع و مستندات رسمی

پس از نصب گواهی، تنظیمات امنیتی سرور را در هاردنینگ سرور پی بگیرید.

چک لیست کامل امن سازی سرور در هاردنینگ سرور لینوکس و ویندوز است و نصب خود Nginx را در نصب Nginx روی اوبونتو نوشته ایم. گواهی ها، ریدایرکت و هشدار انقضا روی سرورهای شما بخشی از کار روزمره مدیریت سرور لینوکس است.

نحوه تهیه مقاله ها

مقاله های مرتبط

استعلام

کارتان را بگویید، مسیر و هزینه را می گوییم

چند خط درباره وضعیت فعلی و چیزی که می خواهید بنویسید. یک مهندس خودش با شما تماس می گیرد و درخواست به واحد فروش نمی رود.

  1. 01درخواست را می خوانیم و اگر ابهامی بود تماس می گیریم.
  2. 02در صورت نیاز، بررسی اولیه ریموت یا بازدید انجام می شود.
  3. 03پیشنهاد مکتوب با دامنه کار، زمان بندی و هزینه می فرستیم.

اطلاعات شما فقط برای پاسخ به همین درخواست استفاده می شود. حریم خصوصی