نصب SSL رایگان روی Nginx یعنی فعال کردن HTTPS روی سایت شما با یک گواهی رایگان از Let’s Encrypt تا ارتباط بین سرور و مرورگر کاربران رمزنگاری شود. بدون HTTPS، مرورگرها سایت را «ناامن» علامت میزنند که هم اعتماد کاربر را از بین میبرد و هم به سئو آسیب میزند، چون گوگل از سال ها پیش HTTPS را یک سیگنال رتبه بندی میداند.
خبر خوب این است که این کار روی اوبونتو 24.04 با ابزار رسمی Certbot بسیار ساده است و در کمتر از پانزده دقیقه از HTTP به HTTPS کامل میرسید. در این راهنما گام به گام جلو میرویم: از نصب Certbot و باز کردن پورت فایروال، تا گرفتن و نصب گواهی، تمدید خودکار، سخت سازی TLS و رفع خطاهای رایج.
گواهی های Let’s Encrypt رایگان و مورد اعتماد همهٔ مرورگرها هستند، توسط بیش از میلیون ها سایت در سراسر جهان استفاده میشوند و 90 روز اعتبار دارند؛ اما نگران تمدید نباشید، چون Certbot این کار را به صورت خودکار انجام میدهد. تمام مراحل این راهنما روی اوبونتو 24.04 تست شده و برای نسخه های LTS دیگر مثل 22.04 هم تقریبا یکسان است.
گواهی SSL یا TLS یک فایل دیجیتال است که ارتباط بین سرور و مرورگر کاربر را رمزنگاری میکند تا اطلاعاتی مثل رمز عبور و اطلاعات پرداخت در مسیر شنود نشوند. وقتی سایت شما گواهی SSL معتبر داشته باشد، آدرس آن با https شروع میشود و مرورگر یک قفل امن نشان میدهد.
Let’s Encrypt یک مرجع صدور گواهی (CA) رایگان و خودکار است که توسط بنیادی غیرانتفاعی اداره میشود و گواهی هایش همان سطح رمزنگاری گواهی های پولی را دارند. ابزار رسمی برای گرفتن این گواهی، Certbot نام دارد که کل فرآیند صدور و نصب و تمدید را خودکار میکند. به همین دلیل نصب SSL رایگان روی Nginx امروز کار پیچیده ای نیست و نیازی به دانش عمیق رمزنگاری ندارد.
شاید بپرسید چرا باید وقت بگذارید و SSL نصب کنید. پاسخ در سه فایدهٔ روشن است که هر کدام به تنهایی ارزش این کار را دارند.
اول امنیت: HTTPS داده های رد و بدل شده بین کاربر و سرور را رمزنگاری میکند تا رمز عبور، اطلاعات فرم و پرداخت در مسیر قابل شنود نباشند. دوم اعتماد کاربر: مرورگرها سایت های بدون HTTPS را با برچسب «ناامن» نشان میدهند که بازدیدکننده را فراری میدهد، در حالی که قفل امن حس اطمینان میسازد. سوم سئو: گوگل از سال 2014 اعلام کرده HTTPS یک سیگنال رتبه بندی است و امروز داشتن آن یک انتظار پایه محسوب میشود، نه یک مزیت اضافه.
علاوه بر این، بسیاری از امکانات مدرن مرورگر و پروتکل سریع HTTP/2 فقط روی HTTPS کار میکنند، پس نصب SSL علاوه بر امنیت به سرعت سایت هم کمک میکند.
یک سوال رایج این است که وقتی Let’s Encrypt رایگان است، چرا بعضی ها گواهی پولی میخرند. پاسخ در نوع اعتبارسنجی و امکانات جانبی است، نه در قدرت رمزنگاری.
گواهی های Let’s Encrypt از نوع اعتبارسنجی دامنه (DV) هستند؛ یعنی فقط مالکیت دامنه را تایید میکنند و برای اکثر سایت ها کاملا کافی اند. گواهی های پولی گاهی اعتبارسنجی سازمانی (OV) یا توسعه یافته (EV) ارائه میدهند که هویت شرکت را هم تایید میکنند و بیشتر برای سایت های بانکی و شرکتی بزرگ کاربرد دارند. همچنین گواهی های پولی معمولا بیمه و پشتیبانی تجاری دارند. اما از نظر سطح رمزنگاری و امنیت اتصال، هیچ تفاوتی بین گواهی رایگان و پولی وجود ندارد.
قبل از شروع، مطمئن شوید این موارد آماده اند تا در میانهٔ کار به مشکل نخورید:
نکتهٔ مهم: رکورد A دامنه حتما باید به سرور شما اشاره کند، چون Let’s Encrypt با روش چالش HTTP، مالکیت دامنه را از همین مسیر تایید میکند. اگر هنوز سرور اوبونتو خود را آماده نکرده اید، ابتدا آموزش نصب اوبونتو سرور را دنبال کنید.
برای نصب Certbot دو روش رایج وجود دارد. تیم Certbot روش snap را توصیه میکند چون همیشه آخرین نسخه را با به روزرسانی خودکار میدهد، اما روش apt هم ساده و سریع است.
# به روزرسانی snapd sudo snap install core; sudo snap refresh core # حذف نسخه قدیمی Certbot در صورت وجود sudo apt remove certbot -y # نصب Certbot sudo snap install --classic certbot # ساخت لینک برای اجرای دستور certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot
اگر ترجیح میدهید از مخزن رسمی اوبونتو استفاده کنید، این روش کوتاه تر است:
sudo apt update sudo apt install certbot python3-certbot-nginx -y
بستهٔ python3-certbot-nginx همان پلاگینی است که به Certbot اجازه میدهد فایل پیکربندی Nginx شما را به صورت خودکار بخواند و ویرایش کند. هر دو روش برای اوبونتو 24.04 کار میکنند؛ اگر آخرین امکانات را میخواهید snap، و اگر سادگی را snap یا apt.
اگر فایروال UFW روی سرور فعال است، باید ترافیک HTTPS را هم اجازه بدهید. Nginx در UFW یک پروفایل آماده دارد که کار را ساده میکند:
# اجازه به ترافیک HTTP و HTTPS sudo ufw allow 'Nginx Full' # حذف پروفایل فقط HTTP (اختیاری) sudo ufw delete allow 'Nginx HTTP' # بررسی وضعیت sudo ufw status
پروفایل Nginx Full هم پورت 80 و هم 443 را باز میکند. اگر پورت 443 بسته باشد، بعد از نصب گواهی هم سایت روی HTTPS در دسترس نخواهد بود، پس این گام را جدی بگیرید.
حالا نوبت اصل کار است. با پلاگین Nginx، Certbot گواهی را میگیرد، فایل پیکربندی Nginx را ویرایش میکند و HTTPS را در یک مرحله فعال میکند. دامنهٔ خود را جایگزین کنید:
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
در اولین اجرا، Certbot چند سوال میپرسد: آدرس ایمیل برای هشدارهای تمدید، پذیرش شرایط استفاده، و اینکه آیا میخواهید ترافیک HTTP به صورت خودکار به HTTPS هدایت شود. توصیه میشود گزینهٔ هدایت (Redirect) را انتخاب کنید تا همهٔ بازدیدها روی نسخهٔ امن بروند.
پس از پاسخ به این سوال ها، Certbot با سرورهای Let’s Encrypt ارتباط میگیرد و با روش چالش HTTP-01 مالکیت دامنه را تایید میکند؛ یعنی یک فایل موقت روی سرور میگذارد و از Let’s Encrypt میخواهد آن را بخواند. اگر تایید موفق باشد، گواهی صادر و مسیر آن ذخیره میشود:
Certificate saved at: /etc/letsencrypt/live/yourdomain.com/fullchain.pem Key saved at: /etc/letsencrypt/live/yourdomain.com/privkey.pem Successfully deployed certificate to /etc/nginx/...
همین. حالا سایت شما روی HTTPS فعال است و Nginx به صورت خودکار تنظیم شده است.
یک گواهی میتواند چند دامنه و زیردامنه را با هم پوشش دهد. کافی است هر دامنه را با یک d- جداگانه به دستور اضافه کنید:
sudo certbot --nginx -d site1.com -d www.site1.com -d site2.com
به این نوع گواهی، گواهی SAN میگویند و مدیریت را ساده میکند، چون به جای چند گواهی جدا، همه را در یک گواهی و یک فرآیند تمدید نگه میدارید.
پلاگین Nginx راحت ترین روش است، اما گاهی میخواهید کنترل بیشتری داشته باشید یا نمیخواهید Certbot فایل پیکربندی Nginx شما را دستکاری کند. در این حالت دو روش دیگر وجود دارد.
روش webroot زمانی مناسب است که سایت شما در حال اجراست و فقط میخواهید گواهی را بگیرید بدون تغییر خودکار پیکربندی. در این روش Certbot فایل تایید را در پوشهٔ ریشهٔ سایت میگذارد:
sudo certbot certonly --webroot -w /var/www/yourdomain.com -d yourdomain.com
روش standalone هم برای زمانی است که هنوز وب سروری در حال اجرا نیست؛ در این حالت Certbot خودش موقتا یک وب سرور کوچک روی پورت 80 بالا می آورد تا تایید انجام شود. توجه کنید برای این روش باید پورت 80 آزاد باشد و Nginx موقتا متوقف شود:
sudo systemctl stop nginx sudo certbot certonly --standalone -d yourdomain.com sudo systemctl start nginx
در هر دو روش، گواهی صادر و ذخیره میشود اما نصب و اتصال آن به پیکربندی Nginx را باید خودتان به صورت دستی انجام دهید، که در بخش بعد توضیح میدهیم. این روش ها برای محیط های خاص یا پیکربندی های پیچیده کاربرد دارند.
اگر گواهی را با روش دستی گرفتید یا میخواهید پیکربندی را خودتان کنترل کنید، باید مسیر گواهی را در بلاک server مربوط به پورت 443 وارد کنید. یک نمونهٔ ساده به این شکل است:
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
root /var/www/yourdomain.com;
index index.html;
} برای اینکه همهٔ بازدیدکنندگان به نسخهٔ امن هدایت شوند، یک بلاک جداگانه برای پورت 80 بسازید که همهٔ ترافیک HTTP را به HTTPS ریدایرکت کند:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
} بعد از هر تغییر، پیکربندی را تست و Nginx را بارگذاری مجدد کنید تا تغییرات اعمال شوند. این ریدایرکت تضمین میکند که هیچ کاربری روی نسخهٔ ناامن نماند.
اگر روی یک سرور چند سایت (چند بلاک server) دارید، میتوانید برای هر کدام گواهی جدا بگیرید. Certbot به صورت خودکار بلاک های server موجود را تشخیص میدهد و هنگام اجرا از شما میپرسد برای کدام دامنه گواهی صادر شود.
نکتهٔ مهم این است که هر بلاک server باید مقدار server_name درست و منحصربه فرد داشته باشد، چون Certbot از همین مقدار برای پیدا کردن بلاک درست استفاده میکند. اگر دو بلاک server_name یکسان یا نادرست داشته باشند، Certbot ممکن است بلاک اشتباه را انتخاب کند یا اصلا بلاک مناسب را پیدا نکند. پس قبل از صدور گواهی، مطمئن شوید هر سایت server_name خودش را دارد و فایل پیکربندی آن در پوشهٔ sites-enabled فعال است.
برای اطمینان از درستی کار، آدرس سایت را با https در مرورگر باز کنید و قفل امن را کنار آدرس ببینید. اگر قفل نمایش داده شد، گواهی درست نصب شده است.
برای بررسی دقیق تر کیفیت پیکربندی TLS، میتوانید از ابزار آنلاین SSL Labs استفاده کنید که به پیکربندی شما نمره میدهد و نقاط ضعف را نشان میدهد. هدف رسیدن به نمرهٔ A یا A+ است که با سخت سازی TLS در بخش بعد به دست می آید.
گواهی های Let’s Encrypt 90 روز اعتبار دارند، اما Certbot به صورت خودکار آن ها را قبل از انقضا تمدید میکند. هنگام نصب، یک تایمر systemd (یا کران جاب) ساخته میشود که روزی دو بار وضعیت گواهی ها را بررسی و در صورت نزدیک بودن به انقضا تمدید میکند. پس نیازی به کار دستی نیست و همین خودکار بودن، یکی از بزرگ ترین مزیت های Certbot نسبت به مدیریت دستی گواهی هاست که در گذشته دردسر اصلی مدیران سرور بود.
برای اطمینان از درست کار کردن تمدید، میتوانید یک تمدید آزمایشی اجرا کنید که بدون تغییر واقعی، کل فرآیند را شبیه سازی میکند:
sudo certbot renew --dry-run
اگر این دستور بدون خطا اجرا شود، یعنی تمدید خودکار به درستی تنظیم شده و گواهی شما هیچ وقت منقضی نمیشود.
گاهی به دلایلی مثل تغییر پیکربندی Nginx یا بسته شدن پورت، تمدید خودکار با مشکل مواجه میشود. اگر تمدید آزمایشی خطا داد، ابتدا مطمئن شوید پورت 80 همچنان از اینترنت در دسترس است، چون Certbot برای تایید مجدد به آن نیاز دارد. سپس بررسی کنید که مقدار server_name در پیکربندی Nginx تغییر نکرده باشد و فایل های گواهی در مسیر پیش فرض باقی مانده باشند.
وضعیت تایمر تمدید را هم میتوانید بررسی کنید تا مطمئن شوید فعال است و طبق برنامه اجرا میشود:
sudo systemctl status snap.certbot.renew.timer sudo systemctl list-timers | grep certbot
حتی با تمدید خودکار، عاقلانه است که انقضای گواهی را زیر نظر داشته باشید تا اگر روزی تمدید بی سر و صدا شکست خورد، غافلگیر نشوید. ساده ترین راه، استفاده از هشدار ایمیلی است؛ همان ایمیلی که هنگام صدور گواهی وارد کردید، از Let’s Encrypt پیام هشدار نزدیک شدن به انقضا دریافت میکند.
برای بررسی دستی تاریخ انقضا هم میتوانید از دستور openssl استفاده کنید که مستقیما تاریخ اعتبار گواهی نصب شده را نشان میدهد:
echo | openssl s_client -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates
ابزارهای مانیتورینگ بیرونی هم وجود دارند که به صورت دوره ای سایت شما را چک میکنند و اگر گواهی نزدیک به انقضا بود، به شما هشدار میدهند. برای سایت های مهم، فعال کردن این نوع هشدار یک لایهٔ اطمینان اضافه است.
گاهی لازم است گواهی های نصب شده را ببینید یا یکی را حذف کنید. Certbot دستورهای ساده ای برای این کار دارد.
# فهرست گواهی های نصب شده و تاریخ انقضا sudo certbot certificates # باطل کردن یک گواهی (مثلا برای دامنه حذف شده) sudo certbot revoke --cert-name yourdomain.com # حذف کامل گواهی sudo certbot delete --cert-name yourdomain.com
دستور certbot certificates یک نمای کلی از همهٔ گواهی ها، دامنه ها و تاریخ انقضای آن ها میدهد و برای بررسی سریع وضعیت مفید است. باطل کردن و حذف هم زمانی به کار می آیند که دامنه ای را کنار گذاشته اید.
پیکربندی پیش فرض Certbot خوب است، اما برای رسیدن به بالاترین سطح امنیت و نمرهٔ A+ در SSL Labs، چند تنظیم اضافه را داخل بلاک server مربوط به پورت 443 اضافه کنید. این تنظیمات پروتکل های قدیمی و ناامن را غیرفعال و رمزنگاری قوی را فعال میکنند:
# فقط TLS 1.2 و 1.3 فعال باشد ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers off; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; # OCSP stapling برای سرعت بیشتر ssl_stapling on; ssl_stapling_verify on; resolver 1.1.1.1 8.8.8.8 valid=300s;
برای کاهش سربار دست دادن مکرر TLS هم میتوانید کش نشست را فعال کنید که سرعت اتصال کاربران بازگشتی را بیشتر میکند:
ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d;
یک لایهٔ امنیتی مهم دیگر HSTS است که به مرورگر میگوید فقط از طریق HTTPS به سایت وصل شود. با احتیاط آن را فعال کنید، چون بعد از فعال سازی، مرورگرها برای مدتی فقط HTTPS را قبول میکنند:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
بعد از هر تغییر، حتما پیکربندی Nginx را تست و سپس بارگذاری مجدد کنید تا مطمئن شوید خطایی وجود ندارد:
sudo nginx -t sudo systemctl reload nginx
اگر میخواهید یک گواهی برای همهٔ زیردامنه ها (مثلا star.yourdomain.com) بگیرید، باید از گواهی Wildcard استفاده کنید که تاییدش با روش چالش DNS انجام میشود، نه HTTP. در این روش یک رکورد TXT موقت به DNS اضافه میکنید:
sudo certbot certonly --manual --preferred-challenges dns -d "*.yourdomain.com" -d yourdomain.com
Certbot یک مقدار به شما میدهد که باید به صورت رکورد TXT در DNS دامنه ثبت کنید و بعد از تایید، گواهی Wildcard صادر میشود. این روش برای سایت هایی با زیردامنه های زیاد بسیار کاربردی است.
گاهی در فرآیند صدور گواهی به خطا برمیخورید. رایج ترین خطاها و راه حلشان اینها هستند.
شکست چالش HTTP-01: این خطا معمولا یعنی پورت 80 از اینترنت در دسترس نیست. مطمئن شوید فایروال سرور و شبکه پورت 80 را باز گذاشته و رکورد A دامنه به همین سرور اشاره میکند. عدم یافتن بلاک server: اگر Certbot میگوید بلاک server مناسب پیدا نشد، مقدار server_name در فایل پیکربندی Nginx را بررسی کنید؛ باید دقیقا با دامنهٔ درخواستی یکی باشد. خطای IP به جای دامنه: Let’s Encrypt فقط برای نام دامنهٔ معتبر گواهی صادر میکند، نه برای آدرس آی پی؛ پس حتما از یک دامنهٔ واقعی استفاده کنید.
محدودیت نرخ صدور (Rate Limit): Let’s Encrypt برای جلوگیری از سواستفاده، محدودیتی روی تعداد گواهی صادرشده برای یک دامنه در هفته دارد. اگر چند بار پشت سر هم گواهی بگیرید، ممکن است موقتا به این محدودیت بخورید. برای تست های مکرر، از محیط آزمایشی (staging) با افزودن گزینهٔ dry-run– یا test-cert– استفاده کنید تا به محدودیت واقعی نخورید.
هر بار که Certbot اجرا میشود، جزئیات کامل را در یک فایل لاگ ثبت میکند. اگر با خطایی روبرو شدید که علتش مشخص نیست، این لاگ اولین جایی است که باید ببینید:
sudo tail -n 50 /var/log/letsencrypt/letsencrypt.log
این لاگ معمولا دقیقا میگوید مشکل کجاست؛ مثلا شکست در تایید دامنه، مشکل دسترسی به فایل، یا خطای شبکه. خواندن چند خط آخر لاگ اغلب سریع تر از حدس زدن، شما را به علت اصلی میرساند.
Certbot رایج ترین و رسمی ترین ابزار است، اما تنها گزینه نیست. ابزار دیگری به نام acme.sh وجود دارد که کاملا با اسکریپت شل نوشته شده، بسیار سبک است و نیازی به نصب پایتون ندارد؛ برای سرورهای مینیمال یا محیط هایی که نمیخواهید وابستگی اضافه نصب کنید مناسب است.
علاوه بر Let’s Encrypt، مراجع صدور رایگان دیگری مثل ZeroSSL هم وجود دارند که با همان پروتکل ACME کار میکنند و میتوانید با همین ابزارها از آن ها هم گواهی بگیرید. با این حال برای اکثر کاربران روی اوبونتو و Nginx، ترکیب Certbot و Let’s Encrypt ساده ترین، پایدارترین و بهترین مستندشده ترین انتخاب است و نیازی به سراغ گزینه های دیگر رفتن نیست مگر برای موارد خاص.
برای امنیت کلی سرور در کنار SSL هم پیشنهاد میکنیم چک لیست امن سازی اولیهٔ سرور را دنبال کنید تا کل سرور، نه فقط اتصال، امن باشد.
اگر میخواهید سریع و بدون خطا SSL را روی Nginx فعال کنید، این ترتیب ساده را دنبال کنید.
مطمئن شو دامنه با رکورد A به سرور اشاره میکند، Nginx فعال است و پورت 80 و 443 باز اند.
Certbot را نصب کن و با دستور certbot –nginx گواهی را بگیر و گزینه هدایت به HTTPS را انتخاب کن.
با renew –dry-run تمدید را تست کن و تنظیمات TLS و HSTS را برای نمره A+ اضافه کن.
برای جزئیات فنی و گزینه های بیشتر هم میتوانید به مستندات رسمی Certbot مراجعه کنید.
جمع بندی: نصب SSL رایگان روی Nginx در اوبونتو 24.04 با Certbot کار ساده و سریعی است: Certbot را نصب میکنید، با پلاگین Nginx گواهی را میگیرید، پورت فایروال را باز میکنید و تمام. تمدید خودکار است و با چند تنظیم اضافه میتوانید به بالاترین سطح امنیت TLS برسید.
با فعال کردن HTTPS، هم داده های کاربران را رمزنگاری میکنید، هم اعتماد بازدیدکنندگان را جلب و هم سیگنال مثبتی به گوگل برای سئو ارسال میکنید. این یکی از کم هزینه ترین و پرارزش ترین کارهایی است که برای سایتتان میتوانید انجام دهید. با توجه به اینکه امروزه HTTPS یک استاندارد پایه است و مرورگرها سایت های بدون آن را به وضوح ناامن نشان میدهند، تعلل در نصب SSL عملا به معنی از دست دادن بخشی از بازدیدکنندگان و اعتماد آن هاست.
زیرساخت پایدار با NVMe برای اجرای Nginx و SSL؛ بقیه اش با ما.
بله. Let’s Encrypt کاملا رایگان است و همان سطح رمزنگاری گواهی های پولی را ارائه میدهد و مورد اعتماد همهٔ مرورگرهای اصلی است. تنها تفاوتش نداشتن برخی امکانات تجاری مثل بیمهٔ گواهی است.
اعتبار کوتاه به امنیت کمک میکند و باعث میشود گواهی ها مرتب تازه شوند. نگران نباشید، چون Certbot تمدید را به صورت خودکار قبل از انقضا انجام میدهد.
خیر. Let’s Encrypt فقط برای نام دامنهٔ معتبر گواهی صادر میکند و برای آدرس آی پی گواهی نمیدهد. باید یک دامنهٔ ثبت شده داشته باشید.
مطمئن شوید هنگام اجرای Certbot گزینهٔ هدایت به HTTPS را انتخاب کرده اید. اگر نه، میتوانید دوباره certbot –nginx را اجرا کنید یا در پیکربندی Nginx یک ریدایرکت از HTTP به HTTPS اضافه کنید.
دستور sudo certbot renew –dry-run را اجرا کنید. اگر بدون خطا اجرا شد، تمدید خودکار درست تنظیم شده و گواهی شما منقضی نخواهد شد.