بلاگ/نصب گواهی SSL رایگان با Let's Encrypt و Certbot روی سرور مجازی و اختصاصی لینوکس
به‌روز شده

نصب گواهی SSL رایگان با Let's Encrypt و Certbot روی سرور مجازی و اختصاصی لینوکس

1405/07/133 بازدید
نصب گواهی SSL رایگان با Let's Encrypt و Certbot روی سرور مجازی و اختصاصی لینوکس

نصب گواهی SSL رایگان با Let's Encrypt و Certbot روی سرور مجازی و اختصاصی لینوکس

اگر سایت یا سرویس شما هنوز روی HTTP اجرا می‌شود، مرورگرها آن را به کاربر به‌عنوان «غیرامن» نشان می‌دهند و گوگل هم در رتبه‌بندی به آن امتیاز کمتری می‌دهد. خوشبختانه برای گرفتن HTTPS دیگر نیازی به خرید گواهی نیست؛ با Let's Encrypt و ابزار Certbot می‌توانید در چند دقیقه روی هر سرور لینوکسی - چه یک سرور مجازی کوچک، چه یک سرور اختصاصی پربار - نصب SSL رایگان را کامل کنید.

در این مطلب مراحل نصب روی آپاچی را کامل جلو می‌رویم و به تفاوتش با Nginx هم اشاره می‌کنیم، بعد تمدید خودکار گواهی را راه می‌اندازیم تا هیچ‌وقت سایت‌تان بعد از ۹۰ روز بدون HTTPS نماند.

چرا Let's Encrypt برای نصب SSL رایگان؟

Let's Encrypt یک مرجع صدور گواهی (CA) غیرانتفاعی است که از سال ۲۰۱۵ گواهی‌های SSL/TLS رایگان صادر می‌کند و توسط تمام مرورگرهای اصلی به‌عنوان مرجع معتبر شناخته می‌شود. Certbot هم کلاینت رسمی‌ست که درخواست گواهی، تنظیم خودکار وب‌سرور و تمدید دوره‌ای را برای شما انجام می‌دهد.

تفاوت اصلی‌اش با گواهی‌های تجاری در اعتبار کوتاه‌تر (۹۰ روز به‌جای یک یا چند سال) و نبود گزینه‌هایی مثل EV یا بیمه است؛ در عوض چون صدورش کاملاً خودکار و رایگان است، تمدید را هم می‌توان با یک کرون‌جاب خودکار کرد و دیگر نگران انقضای گواهی نباشید.

ویژگیLet's Encrypt (رایگان)گواهی SSL تجاری (پولی)
هزینهرایگانمعمولاً سالانه، از چند ده تا چند صد دلار
مدت اعتبار۹۰ روز۱ تا ۲ سال
تمدیدخودکار با Certbotمعمولاً دستی
نوع گواهیDomain Validation (DV)DV، OV یا EV
مناسب برایبلاگ، سایت شرکتی، API، سرویس داخلیفروشگاه بزرگ، بانک، سازمانی با نیاز به EV

برای بیشتر سایت‌ها و API‌های داخلی همین DV رایگان کافی است؛ فقط اگر واقعاً به تایید سازمانی (OV/EV) نیاز دارید - مثلاً برای درگاه پرداخت با الزامات خاص - باید گواهی تجاری بخرید.

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

قبل از اجرای هر دستوری این موارد را چک کنید:

  • یک دامنه که رکورد A آن به IP سرور (مجازی یا اختصاصی) اشاره می‌کند و DNS آن propagate شده.
  • دسترسی root یا sudo روی سرور.
  • پورت‌های ۸۰ و ۴۴۳ در فایروال سرور (و در صورت وجود، فایروال پنل میزبانی) باز باشند، چون Let's Encrypt برای تایید مالکیت دامنه از همین پورت‌ها استفاده می‌کند.
  • یک وب‌سرور از قبل نصب‌شده و در حال اجرا - آپاچی یا Nginx.

اگر سرور شما تازه راه‌اندازی شده و هنوز دامنه را به آن متصل نکرده‌اید، اول این کار را انجام دهید؛ Certbot بدون DNS درست کار نمی‌کند.

نصب Certbot روی سرور

روی اوبونتو/دبیان:

sudo apt update
sudo apt install certbot python3-certbot-apache -y

روی CentOS/RHEL (با EPEL):

sudo dnf install epel-release -y
sudo dnf install certbot python3-certbot-apache -y

پلاگین python3-certbot-apache را عمداً همراه نصب کردیم چون در مرحله بعد خودش فایل‌های کانفیگ آپاچی را ویرایش می‌کند. اگر وب‌سرورتان Nginx است، به‌جایش python3-certbot-nginx را نصب کنید.

نصب گواهی SSL روی آپاچی

با یک دستور، Certbot هم گواهی را می‌گیرد و هم VirtualHost آپاچی را برای HTTPS تنظیم می‌کند:

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

چند نکته درباره همین دستور:

  • اگر چند ساب‌دامین دارید، هر کدام را با -d جدا اضافه کنید؛ همه روی یک گواهی قرار می‌گیرند.
  • Certbot یک ایمیل برای اطلاع‌رسانی انقضا می‌پرسد - همین ایمیل است که اگر تمدید خودکار به هر دلیل شکست بخورد، هشدار می‌فرستد.
  • در پایان می‌پرسد که ترافیک HTTP به HTTPS ریدایرکت شود یا نه؛ گزینه ریدایرکت را انتخاب کنید مگر دلیل خاصی برای نگه داشتن HTTP دارید.

بررسی نصب

بعد از اتمام، با مرورگر به https://example.com بروید و قفل سبز کنار آدرس را چک کنید؛ یا از ترمینال:

curl -I https://example.com

اگر هدر HTTP/2 200 یا مشابه برگشت، گواهی فعال است.

اتصال امن HTTPS بین سرور و مرورگر بعد از نصب موفق گواهی SSL رایگان

اگر وب‌سرورتان روی توزیع یا نسخه دیگری است، مراحل مشابه نصب روی CentOS 8 را هم می‌توانید در این آموزش ببینید.

اشاره‌ای به Nginx

روند روی Nginx تقریباً یکسان است، فقط پلاگین و دستور فرق می‌کند:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com

Certbot به همان شکل بلاک server مربوطه در /etc/nginx/sites-available/ را پیدا کرده و تنظیمات SSL را به آن اضافه می‌کند. اگر کانفیگ Nginx شما ساختار غیرمعمولی دارد (مثلاً چند بلاک server در یک فایل برای یک دامنه)، بهتر است قبل از اجرا یک نسخه پشتیبان از فایل کانفیگ بگیرید.

تمدید خودکار گواهی

چون گواهی‌های Let's Encrypt هر ۹۰ روز منقضی می‌شوند، بدون تمدید خودکار دیر یا زود سایت‌تان بدون HTTPS می‌ماند. نصب Certbot روی اکثر توزیع‌ها خودش یک systemd timer یا کرون‌جاب برای این کار اضافه می‌کند. برای اطمینان:

sudo systemctl status certbot.timer

برای تست این‌که تمدید واقعاً کار می‌کند (بدون این‌که گواهی واقعی عوض شود):

sudo certbot renew --dry-run

اگر این timer روی سرورتان وجود ندارد، می‌توانید یک کرون‌جاب دستی اضافه کنید:

sudo crontab -e
# این خط را اضافه کنید:
0 3 * * * certbot renew --quiet

Certbot فقط گواهی‌هایی را تمدید می‌کند که به انقضا نزدیک‌اند (معمولاً ۳۰ روز مانده)، پس اجرای روزانه این دستور مشکلی ایجاد نمی‌کند.

تفاوت نصب روی سرور مجازی و سرور اختصاصی

از نظر دستورات Certbot، نصب SSL رایگان روی یک سرور مجازی و یک سرور اختصاصی هیچ فرقی ندارد؛ چون در هر دو به دسترسی root و کنترل کامل روی فایروال و وب‌سرور نیاز دارید. تفاوت عملی بیشتر در این موارد است:

  • روی سرورهای اختصاصی معمولاً چند فایروال در لایه‌های مختلف (سخت‌افزاری، شبکه، سیستم‌عامل) وجود دارد و باید پورت ۸۰ و ۴۴۳ را در همه آن‌ها باز کنید.
  • روی سرور مجازی که پشت یک پنل کنترل یا Security Group است، گاهی پورت‌ها باید جدا از فایروال سیستم‌عامل هم باز شوند.
  • اگر چند دامنه یا چند سایت روی یک سرور دارید، مدیریت گواهی‌های متعدد روی یک سرور اختصاصی پرترافیک نیاز به دقت بیشتری در زمان‌بندی تمدیدها دارد تا همه در یک لحظه بار اضافه نگذارند.

اگر هنوز سروری انتخاب نکرده‌اید و پروژه‌تان یک سایت یا چند سرویس کوچک است، یک سرور مجازی کافی‌ست؛ برای ترافیک بالا یا نیاز به منابع اختصاصی، سرور اختصاصی گزینه بهتری است.

خطاهای رایج در نصب SSL رایگان

  • خطای Connection refused یا Timeout در اعتبارسنجی دامنه: معمولاً یعنی پورت ۸۰ بسته است یا DNS هنوز propagate نشده. با dig example.com یا nslookup example.com چک کنید که IP برگشتی همان IP سرور باشد.
  • Rate limit exceeded: Let's Encrypt برای هر دامنه در هفته محدودیت تعداد درخواست دارد (معمولاً ۵ گواهی تکراری در هفته). قبل از تست‌های متعدد از محیط staging آن استفاده کنید: --test-cert.
  • گواهی گرفته شد ولی سایت هنوز HTTP نشان می‌دهد: کش مرورگر یا CDN را چک کنید؛ اگر از Cloudflare یا CDN مشابه استفاده می‌کنید، حالت SSL آن باید روی Full یا Full (strict) باشد، نه Flexible.
  • تمدید خودکار شکست می‌خورد: لاگ /var/log/letsencrypt/letsencrypt.log را بخوانید؛ بیشتر وقت‌ها دلیلش این است که در این فاصله پورت ۸۰ بسته شده یا کانفیگ وب‌سرور دستی تغییر کرده است.

جمع‌بندی

نصب SSL رایگان با Let's Encrypt و Certbot روی لینوکس چیزی بین پنج تا ده دقیقه زمان می‌برد و برای اکثر سایت‌ها و سرویس‌ها کاملاً کافی است. نکته مهم‌تر از نصب اولیه، تمدید خودکار است؛ همان لحظه که certbot.timer یا کرون‌جاب را تنظیم کردید، دیگر لازم نیست به یاد انقضای گواهی باشید. اگر سروری که روی آن کار می‌کنید دسترسی root و کنترل کافی روی فایروال نداشته باشد - که در برخی هاستینگ‌های اشتراکی پیش می‌آید - همین مرحله اول نصب هم ممکن است به مشکل بخورد؛ برای چنین مواردی سرور مجازی یا اختصاصی با دسترسی کامل گزینه مطمئن‌تری است.