نصب گواهینامه رایگان با Certbot؛ راهنمای کامل و رفع خطاها

آموزش گام‌به‌گام نصب گواهینامه SSL رایگان با Certbot، تمدید خودکار، اعتبارسنجی HTTP و DNS و رفع رایج‌ترین خطاهای نصب و تمدید.

۶ دقیقه به‌روزرسانی ۳ شهریور ۱۴۰۵

چرا Certbot استاندارد طلایی صدور گواهینامه رایگان است؟

اگر تا به حال برای فعال‌سازی HTTPS روی سرور خود با دردسر تولید CSR، ارسال به مرکز صدور گواهی و انتظار برای تأیید دستی مواجه شده‌اید، Certbot دقیقاً همان ابزاری است که این مسیر را حذف می‌کند. Certbot کلاینت رسمی پروژه Let's Encrypt است و با خودکارسازی کامل فرایند صدور، نصب و تمدید، اتصال امن SSL/TLS را در کمتر از چند دقیقه روی سرور شما برقرار می‌کند.

در این مقاله فرض می‌کنیم با مفاهیم پایه DNS و وب‌سرور آشنایی دارید اما تجربه قبلی با Certbot ندارید. هدف ما این است که پس از خواندن این مطلب، بتوانید گواهینامه رایگان را روی سرور خود نصب کنید، تمدید خودکار را پیکربندی کنید و اگر خطایی در فرایند اعتبارسنجی رخ داد، خودتان آن را عیب‌یابی کنید. اگر به دنبال یک راه‌حل مدیریت‌شده برای هاست یا سرور ابری هستید، سرویس‌های میزبانی ServerNet نیز امکان استفاده از گواهینامه‌های Let's Encrypt را به‌صورت یکپارچه فراهم می‌کنند، اما تمرکز این مقاله بر نصب دستی روی سرور اختصاصی یا VPS است.

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

قبل از هر اقدامی، مطمئن شوید که پیش‌نیازهای زیر برقرار هستند:

  • دسترسی root یا کاربر با sudo به سرور لینوکسی (توزیع‌های Ubuntu، Debian، CentOS یا Rocky Linux)
  • یک دامنه که رکورد A آن به IP سرور شما اشاره کند. برای اعتبارسنجی HTTP، دامنه باید از طریق پورت 80 در دسترس باشد.
  • وب‌سرور نصب‌شده (Apache یا Nginx) و اجرای سرویس آن.
  • باز بودن پورت‌های 80 و 443 در فایروال سرور.
  • یک نکته مهم: اگر دامنه شما روی CDN یا پروکسی معکوس قرار دارد، ابتدا رکورد DNS را مستقیم به IP سرور指向 دهید، در غیر این صورت اعتبارسنجی HTTP با شکست مواجه می‌شود.

    نصب Certbot روی توزیع‌های رایج

    روش نصب بسته به توزیع شما متفاوت است. در Ubuntu و Debian، مخازن رسمی شامل نسخه پایدار Certbot هستند:

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

اگر وب‌سرور شما Apache است، به‌جای پکیج nginx از python3-certbot-apache استفاده کنید. در CentOS یا Rocky Linux با استفاده از Snap نصب کنید:

sudo dnf install epel-release
sudo dnf install snapd
sudo systemctl enable --now snapd.socket
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

پس از نصب، با دستور certbot --version صحت نصب را بررسی کنید. اگر خروجی نسخه را نشان داد، آماده صدور گواهینامه هستید.

صدور گواهینامه با اعتبارسنجی HTTP

ساده‌ترین روش برای صدور گواهینامه، استفاده از پلاگین وب‌سرور است که به‌صورت خودکار فایل اعتبارسنجی را در مسیر ریشه وب قرار می‌دهد. برای Nginx دستور زیر را اجرا کنید:

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

Certbot از شما می‌پرسد که آیا می‌خواهید ریدایرکت HTTP به HTTPS را فعال کنید. گزینه 2 را انتخاب کنید تا تمام ترافیک به‌صورت خودکار به نسخه امن منتقل شود. پس از چند ثانیه، پیام موفقیت‌آمیز همراه با مسیر ذخیره گواهینامه نمایش داده می‌شود.

اگر نمی‌خواهید Certbot تنظیمات وب‌سرور را تغییر دهد، می‌توانید از روش webroot استفاده کنید:

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

در این روش، Certbot فایل موقتی را در دایرکتوری /.well-known/acme-challenge/ ایجاد می‌کند و Let's Encrypt آن را از طریق HTTP بررسی می‌کند. اطمینان حاصل کنید که مسیر -w دقیقاً همان ریشه وب دامنه شماست.

اعتبارسنجی DNS برای دامنه‌های خاص

اگر دامنه شما پشت CDN است، پورت 80 بسته است یا نیاز به گواهی wildcard دارید، باید از اعتبارسنجی DNS استفاده کنید. این روش نیازمند افزودن یک رکورد TXT به DNS دامنه است:

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

Certbot یک مقدار TXT به شما نمایش می‌دهد که باید آن را در پنل مدیریت DNS دامنه خود اضافه کنید. پس از انتشار رکورد (معمولاً 30 ثانیه تا چند دقیقه)، Enter را بزنید تا اعتبارسنجی انجام شود. این روش برای گواهی‌های wildcard ضروری است، اما تمدید خودکار آن نیازمند اسکریپت‌نویسی برای به‌روزرسانی خودکار رکورد DNS است.

پیکربندی تمدید خودکار گواهینامه

گواهینامه‌های Let's Encrypt فقط 90 روز اعتبار دارند، بنابراین تمدید خودکار یک ضرورت است نه یک انتخاب. خوشبختانه Certbot شامل یک تایمر سیستمی است که دو بار در روز بررسی می‌کند آیا گواهی نیاز به تمدید دارد یا خیر. برای اطمینان از فعال بودن آن، دستور زیر را اجرا کنید:

sudo systemctl list-timers | grep certbot

اگر تایمر فعال نیست، آن را با دستور زیر فعال کنید:

sudo systemctl enable --now certbot.timer

برای تست فرایند تمدید به‌صورت دستی، از حالت dry-run استفاده کنید تا مطمئن شوید همه‌چیز بدون خطا کار می‌کند:

sudo certbot renew --dry-run

این دستور هیچ تغییری در گواهی فعلی ایجاد نمی‌کند، فقط فرایند تمدید را شبیه‌سازی می‌کند. اگر خروجی شامل پیام Congratulations باشد، تمدید خودکار به‌درستی کار خواهد کرد.

رفع خطای رایج در تمدید خودکار

یکی از رایج‌ترین مشکلات تمدید خودکار، خطای Certbot failed to authenticate some domains است. این خطا معمولاً به یکی از دلایل زیر رخ می‌دهد:

  • رکورد DNS دامنه تغییر کرده و دیگر به IP سرور اشاره نمی‌کند.
  • فایروال پورت 80 را مسدود کرده است.
  • وب‌سرور هنگام تمدید در دسترس نیست.

برای عیب‌یابی، ابتدا با دستور curl -I http://example.com/.well-known/acme-challenge/test بررسی کنید که مسیر اعتبارسنجی از بیرون قابل دسترسی است. اگر پاسخ 404 دریافت کردید، مشکل از پیکربندی وب‌سرور است.

خطاهای رایج اعتبارسنجی و راه‌حل آن‌ها

در ادامه به بررسی سه خطای پرتکرار در فرایند صدور و تمدید گواهینامه می‌پردازیم.

خطای «Too Many Certificates Issued for Exact Set of Domains»

این خطا به این معنی است که شما در یک ساعت گذشته بیش از ۵ بار برای همان دامنه درخواست صدور گواهی داده‌اید. Let's Encrypt محدودیت نرخ سختی دارد. راه‌حل این است که منتظر بمانید تا محدودیت برطرف شود (معمولاً یک ساعت) و سپس درخواست را تکرار کنید. برای جلوگیری از این خطا، از دستور --dry-run برای تست استفاده کنید و درخواست‌های واقعی را فقط زمانی انجام دهید که پیکربندی نهایی است.

خطای «Invalid Response From http://example.com/.well-known/acme-challenge/...»

این خطا نشان می‌دهد که Let's Encrypt نتوانسته است فایل اعتبارسنجی را از سرور شما دریافت کند. رایج‌ترین علت، وجود ریدایرکت 301 از HTTP به HTTPS است. Certbot فایل را روی HTTP قرار می‌دهد، اما اگر سرور به‌صورت خودکار به HTTPS ریدایرکت کند، اعتبارسنجی شکست می‌خورد. برای رفع این مشکل، به‌طور موقت ریدایرکت را غیرفعال کنید یا از روش DNS استفاده کنید.

خطای «DNS problem: NXDOMAIN looking up A for example.com»

این خطا یعنی رکورد A دامنه شما وجود ندارد یا به IP اشتباه اشاره می‌کند. با دستور dig example.com A رکورد را بررسی کنید. اگر خروجی خالی بود، رکورد را در پنل DNS خود اضافه کنید و منتظر انتشار (propagation) بمانید. معمولاً انتشار DNS بین ۵ تا ۳۰ دقیقه طول می‌کشد، اما در برخی موارد ممکن است تا ۴۸ ساعت هم برسد.

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

پس از نصب موفق، چند نکته برای نگهداری بهتر:

  • گواهینامه‌های خود را در مسیر /etc/letsencrypt/live/example.com/ پیدا خواهید کرد. فایل fullchain.pem شامل زنجیره کامل گواهی است و privkey.pem کلید خصوصی شماست.
  • هرگز کلید خصوصی را در مخازن Git یا سرویس‌های اشتراک‌گذاری فایل قرار ندهید.
  • برای اطلاع از تاریخ انقضای گواهی، از دستور sudo certbot certificates استفاده کنید.
  • اگر وب‌سرور خود را تغییر می‌دهید (مثلاً از Nginx به Apache)، گواهی‌ها قابل انتقال هستند، اما باید پیکربندی تمدید را مجدداً تنظیم کنید.

با رعایت این نکات و استفاده از Certbot، دیگر نگران انقضای گواهینامه یا خطاهای دستی نخواهید بود. HTTPS امروزه یک استاندارد ضروری برای هر وب‌سایتی است و با ابزارهای خودکار مانند Certbot، فعال‌سازی آن به یکی از ساده‌ترین کارهای مدیریت سرور تبدیل شده است.

آیا این مطلب برایتان مفید بود؟