نحوه دریافت SSL در Nginx در سرور مجازی اوبونتو Ubuntu با Let’s Encrypt
۱۵ بهمن ۱۴۰۳
مقدمه
Let’s Encrypt یک مرجع صدور گواهینامه (Certificate Authority – CA) است که راهکاری ساده برای دریافت و نصب گواهینامههای رایگان TLS/SSL فراهم میکند و در نتیجه، امکان اتصال امن HTTPS را روی سرورهای وب فعال میسازد. این سرویس با ارائه یک کلاینت نرمافزاری به نام Certbot، فرایند دریافت و نصب گواهینامه را بهشدت ساده میکند و تلاش میکند تا بیشتر مراحل مورد نیاز را بهصورت خودکار انجام دهد. در حال حاضر، کل فرایند دریافت و نصب گواهینامه روی هر دو وبسرور Apache و Nginx کاملاً خودکار است.
در این آموزش، با استفاده از Certbot یک گواهینامه SSL رایگان برای Nginx در Ubuntu دریافت خواهیم کرد و تنظیمات مربوط به تمدید خودکار گواهینامه را انجام میدهیم. همچنین، به جای ویرایش فایل پیشفرض Nginx، از یک فایل پیکربندی جداگانه برای سرور مجازی استفاده خواهیم کرد. پیشنهاد میکنیم برای هر دامنه یک فایل پیکربندی اختصاصی در Nginx ایجاد کنید؛ زیرا این کار از وقوع خطاهای رایج، جلوگیری میکند و در عین حال، فایلهای پیشفرض را به عنوان یک پیکربندی پشتیبان، حفظ میکند.
پیشنیازها
برای دنبال کردن این آموزش، به موارد زیر نیاز خواهید داشت:
- یک سرور مجازی Ubuntu که با دنبال کردن آموزش راهاندازی اولیه سرور برای Ubuntu، راهاندازی شده و شامل یک کاربر غیر root با دسترسی sudo و یک فایروال فعال است؛ برای این کار، میتوانید از سرور مجازی لیارا، استفاده کنید.
- یک دامنه ثبتشده. در این آموزش از
example.com
بهعنوان نام دامنه استفاده خواهد شد. - تنظیم دو رکورد DNS زیر برای سرور خود. اگر از سامانه مدیریت دامنه لیارا، استفاده میکنید، لطفاً به مستندات DNS آن، مراجعه کنید تا جزئیات مربوط به شیوهی اضافه کردن رکوردها را ببینید.
- یک رکورد A که
example.com
را به آدرس IP عمومی سرور شما ارجاع دهد. - یک رکورد A که www.example.com را به آدرس IP عمومی سرور شما ارجاع دهد.
- یک رکورد A که
- نصب Nginx با دنبال کردن آموزش نصب Nginx بر روی Ubuntu. مطمئن شوید که یک بلوک سرور برای دامنه خود دارید. در این آموزش از
/etc/nginx/sites-available/example.com
بهعنوان نمونه استفاده خواهد شد.
در ادامه، بخوانید:
- مرحله اول: نحوه نصب Certbot در سرور مجازی Ubuntu
- مرحله دوم: نحوه پیکربندی و تایید پیکربندی در Nginx
- مرحله سوم: نحوه اجازهدادن به HTTPS از طریق فایروال
- مرحله چهارم: نحوه دریافت گواهینامه SSL
- مرحله پنجم: نحوه تایید تمدید خودکار Certbot
- نتیجهگیری
مرحله اول: نحوه نصب Certbot در سرور مجازی Ubuntu
Certbot توصیه میکند که از پکیج snap برای نصب آن، استفاده کنید. پکیجهای snap تقریباً روی تمام توزیعهای لینوکس کار میکنند، اما نیاز است که ابتدا snapd
را نصب کنید تا بتوانید پکیجهای snap را مدیریت کنید. Ubuntu از snaps پشتیبانی میکند، بنابراین میتوانید با اطمینان از بهروز بودن snapd
خود، شروع کنید:
sudo snap install core; sudo snap refresh core
اگر روی یک سرور کار میکنید که قبلاً نسخه قدیمیتری از certbot روی آن، نصب شده بود، باید آن را در ابتدا، حذف کنید:
sudo apt remove certbot
پس از آن، میتوانید پکیج certbot را نصب کنید:
sudo snap install --classic certbot
در نهایت، میتوانید دستور certbot
را از دایرکتوری نصب شده snap به path خود لینک کنید تا بتوانید فقط با تایپ certbot آن را اجرا کنید. این کار بهتر است برای جلوگیری از تداخلات دستوری، در همه پکیجها استفاده نشود، اما پکیجهای snap بهطور پیشفرض؛ کمترین تداخل را دارند:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
حالا که Certbot نصب شد، بیایید آن را اجرا کنیم تا گواهینامه خود را دریافت کنیم.
مرحله دوم: نحوه پیکربندی و تایید پیکربندی در Nginx
Certbot نیاز دارد که بلوک سرور صحیح را در پیکربندی Nginx پیدا کند تا بتواند SSL را بهطور خودکار، پیکربندی کند. بهطور خاص، Certbot این کار را با جستجوی دستور server_name
انجام میدهد که با دامنهای که برای آن گواهینامه درخواست میکنید، مطابقت داشته باشد.
اگر مرحله تنظیم بلوک سرور در آموزش نصب Nginx را دنبال کردهاید، باید یک بلوک سرور برای دامنه خود در مسیر /etc/nginx/sites-available/example.com
داشته باشید که در آن بلوک، دستور server_name
بهدرستی تنظیم شده باشد. برای بررسی این موضوع، فایل پیکربندی دامنه خود را با استفاده از nano
یا ویرایشگر متن مورد علاقه خود باز کنید:
sudo nano /etc/nginx/sites-available/example.com
دستور server_name
موجود را پیدا کنید. باید به شکل زیر باشد:
...
server_name example.com www.example.com;
...
اگر اینطور بود، ویرایشگر خود را ببندید و به مرحله بعدی بروید. اگر اینطور نبود، آن را بهگونهای بهروزرسانی کنید که مطابقت داشته باشد. سپس فایل را ذخیره کنید، از ویرایشگر خارج شوید و نحوه صحیح بودن سینتکس پیکربندی خود را بررسی کنید:
sudo nginx -t
اگر با خطایی مواجه شدید، فایل بلوک سرور را دوباره باز کرده و بررسی کنید که هیچ اشتباه تایپی یا کاراکتر گمشدهای وجود نداشته باشد. پس از اینکه سینتکس پیکربندی شما صحیح شد، Nginx
را برای بارگذاری پیکربندی جدید دوباره راهاندازی کنید:
sudo systemctl reload nginx
حالا، Certbot میتواند بلوک سرور صحیح را پیدا کرده و بهطور خودکار آن را بهروزرسانی کند. در مرحله بعد، فایروال را بهروزرسانی میکنیم تا ترافیک HTTPS اجازه عبور داشته باشد.
مرحله سوم: نحوه اجازهدادن به HTTPS از طریق فایروال
اگر فایروال ufw
را مطابق با راهنماهای پیشنیاز فعال کرده باشید، باید تنظیمات آن را تغییر دهید تا ترافیک HTTPS نیز مجاز باشد. خوشبختانه، Nginx هنگام نصب، چندین پروفایل امنیتی را در ufw
ثبت میکند. برای مشاهده وضعیت فعلی فایروال، این دستور را اجرا کنید:
sudo ufw status
خروجی احتمالاً به این شکل خواهد بود، به این معنی که در حال حاضر فقط ترافیک HTTP اجازه ورود به سرور وب را دارد:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
برای مجاز کردن ترافیک HTTPS، باید پروفایل Nginx Full را فعال کرده و مجوز پروفایل Nginx HTTP را حذف کنید:
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
حالا وضعیت فایروال را دوباره بررسی کنید:
sudo ufw status
خروجی، باید مشابه زیر باشد:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
حالا که فایروال به درستی پیکربندی شد، در مرحله بعد Certbot را اجرا میکنیم تا گواهینامههای SSL را دریافت کنیم.
مرحله چهارم: نحوه دریافت گواهینامه SSL
Certbot روشهای مختلفی را برای دریافت گواهینامه SSL ارائه میدهد که این روشها از طریق پلاگینها کار میکنند. پلاگین Nginx وظیفه پیکربندی مجدد Nginx و بارگذاری مجدد تنظیمات را در مواقع ضروری بر عهده دارد. برای استفاده از این پلاگین، دستور زیر را اجرا کنید:
sudo certbot --nginx -d example.com -d www.example.com
این دستور، Certbot را با پلاگین Nginx اجرا کرده و از -d
برای تعیین نام دامنههایی که گواهینامه باید برای آنها معتبر باشد، استفاده میکند. هنگام اجرای این دستور، از شما موارد زیر، خواسته میشود:
- یک آدرس ایمیل وارد کنید.
- با شرایط خدمات، موافقیت کنید.
پس از تکمیل این مراحل، پیامی دریافت خواهید کرد که نشان میدهد فرایند با موفقیت انجام شده است و مسیر ذخیره گواهینامههای شما را مشخص میکند:
IMPORTANT NOTES:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-06-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
اکنون، گواهینامههای SSL شما با موفقیت دریافت، نصب و بارگذاری شدند. حالا پیکربندی Nginx بهطور خودکار تمام درخواستهای وب را به HTTPS هدایت میکند. وبسایت خود را رفرش کنید و نماد قفل را در مرورگر بررسی کنید تا مطمئن شوید که سایت شما به درستی ایمن شده است. برای ارزیابی امنیت سرور خود، میتوانید از تست SSL Labs استفاده کنید. این تست معمولاً امتیاز A را به گواهینامههای صحیح اختصاص میدهد. در مرحله بعد، فرایند تمدید خودکار گواهینامه را آزمایش میکنیم.
مرحله پنجم: نحوه تایید تمدید خودکار Certbot
گواهینامههای Let’s Encrypt فقط ۹۰ روز اعتبار دارند. این محدودیت، برای تشویق کاربران به خودکارسازی فرایند تمدید گواهینامه، اعمال شده است. خوشبختانه، بسته Certbot که نصب کردهایم، این کار را برای ما انجام میدهد. Certbot بهطور خودکار یک تایمر در سیستم ایجاد میکند که روزانه دو بار اجرا میشود و هر گواهینامهای که کمتر از ۳۰ روز تا انقضای آن باقی مانده باشد را تمدید میکند. برای بررسی وضعیت این تایمر، دستور زیر را اجرا کنید:
sudo systemctl status snap.certbot.renew.service
خروجی باید چیزی شبیه به این باشد:
○ snap.certbot.renew.service - Service for snap application certbot.renew
Loaded: loaded (/etc/systemd/system/snap.certbot.renew.service; static)
Active: inactive (dead)
TriggeredBy: ● snap.certbot.renew.timer
برای اطمینان از اینکه تمدید خودکار گواهینامه بهدرستی کار میکند، میتوانید یک اجرای آزمایشی (dry run) انجام دهید:
sudo certbot renew --dry-run
اگر این دستور بدون خطا اجرا شود، یعنی تنظیمات تمدید خودکار، بهدرستی کار میکند. هر زمان که لازم باشد، Certbot گواهینامههای شما را تمدید کرده و Nginx را مجدداً بارگذاری میکند تا تغییرات اعمال شوند. اگر به هر دلیلی فرایند تمدید خودکار ناموفق باشد، Let’s Encrypt یک ایمیل هشدار به آدرسی که هنگام ثبت گواهینامه وارد کردهاید، ارسال میکند و شما را از نزدیک شدن به زمان انقضا مطلع میسازد. اکنون سرور شما بهطور کامل ایمن شده و گواهینامههای SSL بهصورت خودکار تمدید خواهند شد!
نتیجهگیری
در این آموزش، شما مراحل زیر را انجام دادید:
- نصب کلاینت Let’s Encrypt
- دریافت گواهینامه SSL برای دامنه خود
- پیکربندی Nginx برای استفاده از این گواهینامهها
- تنظیم تمدید خودکار گواهینامهها
اکنون وبسایت شما بهطور ایمن از HTTPS پشتیبانی میکند و گواهینامههای SSL آن بهصورت خودکار تمدید خواهند شد. اگر سؤالی درباره استفاده از Certbot دارید، مستندات رسمی Let’s Encrypt یک منبع عالی برای شروع است.
همچنین بخوانید: نحوه نصب انجین ایکس، MySQL و پی اچ پی (LEMP) بر روی سرور مجازی لینوکس