كيفية تأمين Nginx باستخدام Let’s Encrypt على Rocky Linux 9

مقدمة

Let’s Encrypt هي سلطة شهادات (CA) توفر وسيلة متاحة للحصول على شهادات TLS/SSL مجانية وتثبيتها، مما يمكن من تشفير HTTPS على خوادم الويب. يبسط العملية من خلال توفير عميل برمجيات يُدعى Certbot، الذي يحاول أتمتة معظم (إن لم يكن كل) الخطوات المطلوبة. حاليًا، العملية بأكملها للحصول على الشهادة وتثبيتها مُؤتمتة تمامًا على كل من Apache و Nginx.

في هذا البرنامج التعليمي، ستستخدم Certbot للحصول على شهادة SSL مجانية لـ Nginx على Rocky Linux 9 وإعداد الشهادة للتجديد تلقائيًا.

سيستخدم هذا البرنامج التعليمي ملف تكوين خادم Nginx منفصل بدلاً من الملف الافتراضي. يجب عليك إنشاء ملفات كتل خادم Nginx جديدة لكل نطاق لأنه يساعد في تجنب الأخطاء الشائعة والحفاظ على الملفات الافتراضية كتكوين احتياطي.

المتطلبات الأساسية

لمتابعة هذا البرنامج التعليمي، ستحتاج:

  • إعداد خادم Rocky Linux 9 وفقًا لهذا البرنامج التعليمي إعداد الخادم الأولي لـ Rocky Linux 9 ، بما في ذلك مستخدم بدون صلاحيات root وجدار نار.

  • اسم نطاق مسجل. سيتم استخدام example.com في هذا البرنامج التعليمي. يمكنك شراء اسم نطاق من Namecheap، الحصول على واحد مجانًا من Freenom، أو استخدام مسجل النطاق الخاص بك.

  • تهيئة كل من سجلات DNS التالية لخادمك. إذا كنت تستخدم DigitalOcean، يرجى الرجوع إلى وثائق DNS الخاصة بنا للحصول على تفاصيل حول كيفية إضافتها.

    • سجل A بـ example.com يشير إلى عنوان IP العام لخادمك.
    • سجل A بـ www.example.com يشير إلى عنوان IP العام لخادمك.
  • قم بتثبيت Nginx باتباع كيفية تثبيت Nginx على Rocky Linux 9. تأكد من وجود كتلة خادم لنطاقك. سيستخدم هذا البرنامج التعليمي /etc/nginx/sites-available/example.com كمثال.

الخطوة 1 — تثبيت Certbot

أولاً، تحتاج إلى تثبيت حزمة البرنامج certbot. قم بتسجيل الدخول إلى جهاز Rocky Linux 8 الخاص بك بوصفك كمستخدم غير جذري:

  1. ssh sammy@your_server_ip

حزمة certbot غير متوفرة من خلال مدير الحزم افتراضيًا. ستحتاج إلى تمكين مستودع EPEL لتثبيت Certbot.

لإضافة مستودع Rocky Linux 9 EPEL، قم بتشغيل الأمر التالي:

  1. sudo dnf install epel-release

عندما يُطلَب منك تأكيد التثبيت، اكتب وأدخل y.

الآن بما أن لديك الوصول إلى المستودع الإضافي، قم بتثبيت جميع الحزم المطلوبة:

  1. sudo dnf install certbot python3-certbot-nginx

سيقوم هذا بتثبيت Certbot نفسه وإضافة المكون الإضافي لـ Nginx لـ Certbot ، والذي يُطلب لتشغيل البرنامج.

سيطلب عملية التثبيت منك استيراد مفتاح GPG. قم بتأكيد ذلك حتى يتمكن التثبيت من الاكتمال.

الآن بعد أن قمت بتثبيت Certbot ، دعونا نشغله للحصول على شهادة.

الخطوة 2 — تأكيد تكوين Nginx

يحتاج Certbot إلى القدرة على العثور على كتلة الـ server الصحيحة في تكوين Nginx الخاص بك ليتمكن من تكوين SSL تلقائيًا. يقوم بذلك عن طريق البحث عن توجيه server_name الذي يتطابق مع النطاق الذي تطلب شهادة له.

إذا قمت باتباع خطوة إعداد كتلة الخادم في دليل تثبيت Nginx ، فيجب أن يكون لديك كتلة خادم لنطاقك في /etc/nginx/conf.d/example.com مع توجيه server_name مضبوطًا بالفعل بشكل صحيح.

للتحقق ، افتح ملف التكوين الخاص بنطاقك باستخدام nano أو محرر النص المفضل لديك:

  1. sudo nano /etc/nginx/conf.d/example.com

ابحث عن سطر server_name الموجود. يجب أن يبدو هكذا:

/etc/nginx/conf.d/example.com
...
server_name example.com www.example.com;
...

إذا كان الأمر كذلك ، فأغلق المحرر الخاص بك وانتقل إلى الخطوة التالية.

إذا لم يكن كذلك ، فقم بتحديثه ليتطابق. ثم احفظ الملف ، وأغلق المحرر الخاص بك ، وتحقق من صحة تحريرات التكوين الخاصة بك:

  1. sudo nginx -t

إذا واجهت خطأ، أعد فتح ملف تكوين الخادم وتحقق من وجود أي أخطاء إملائية أو أحرف مفقودة. بمجرد أن يكون بناء ملف التكوين صحيحًا من الناحية الصحيحة، أعد تحميل Nginx لتحميل التكوين الجديد:

  1. sudo systemctl reload nginx

يمكن لـ Certbot الآن العثور على كتلة server الصحيحة وتحديثها تلقائيًا.

بعد ذلك، دعونا نقوم بتحديث جدار الحماية للسماح بحركة المرور عبر HTTPS.

الخطوة 3 — تحديث قواعد جدار الحماية

نظرًا لأن إعدادات السابقة تمكن من firewalld، ستحتاج إلى ضبط إعدادات جدار الحماية للسماح بالاتصالات الخارجية على خادم الويب Nginx الخاص بك.

للتحقق من الخدمات التي تم تمكينها بالفعل، قم بتشغيل الأمر:

  1. sudo firewall-cmd --permanent --list-all

ستتلقى إخراجًا مثل هذا:

Output
public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

إذا لم ترى http في قائمة الخدمات، قم بتمكينها عبر الأمر التالي:

  1. sudo firewall-cmd --permanent --add-service=http

للسماح بحركة المرور عبر https، قم بتشغيل الأمر التالي:

  1. sudo firewall-cmd --permanent --add-service=https

لتطبيق التغييرات، ستحتاج إلى إعادة تحميل خدمة الجدار الناري:

  1. sudo firewall-cmd --reload

الآن بعد أن قمت بفتح الخادم الخاص بك لحركة المرور عبر https، أنت الآن جاهز لتشغيل Certbot واسترداد الشهادات الخاصة بك.

الخطوة 4 — الحصول على شهادة SSL

يوفر Certbot مجموعة متنوعة من الطرق للحصول على شهادات SSL من خلال الوصلات الإضافية. سيقوم وصلة Nginx بإعادة تكوين Nginx وإعادة تحميل التكوين عند الضرورة. لاستخدام هذه الوصلة، اكتب ما يلي:

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

يقوم هذا بتشغيل certbot مع الوصلة --nginx، باستخدام -d لتحديد أسماء النطاقات التي تحتاج إلى أن تكون الشهادة صالحة لها.

عند تشغيل الأمر، ستُطلب منك إدخال عنوان بريد إلكتروني والموافقة على شروط الخدمة. بعد القيام بذلك، يجب أن ترى رسالة تخبرك بأن العملية نجحت ومكان تخزين شهاداتك:

Output
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-12-15. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for your_domain to /etc/nginx/conf.d/your_domain.conf Successfully deployed certificate for www.your_domain to /etc/nginx/conf.d/your_domain.conf Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain

تم تنزيل شهاداتك، وتثبيتها، وتحميلها، وستقوم إعدادات Nginx الخاصة بك الآن بإعادة توجيه جميع طلبات الويب تلقائيًا إلى https://. جرب إعادة تحميل موقع الويب الخاص بك ولاحظ مؤشر أمان المتصفح الخاص بك. يجب أن يشير إلى أن الموقع مؤمَّن بشكل صحيح، عادةً مع رمز القفل. إذا قمت بتجربة خادمك باستخدام اختبار SSL Labs Server Test، ستحصل على درجة A.

لننهي بفحص عملية التجديد.

الخطوة 5 — التحقق من تجديد Certbot تلقائيًا

تعتبر شهادات Let’s Encrypt صالحة لمدة 90 يومًا، ولكن من المُوصى به تجديدها كل 60 يومًا للسماح بفرصة لحدوث أي أخطاء. يحتوي عميل Certbot Let’s Encrypt على أمر renew الذي يقوم تلقائيًا بالتحقق من الشهادات المثبتة حاليًا ومحاولة تجديدها إذا كانت أقل من 30 يومًا عن تاريخ الانتهاء.

يمكنك اختبار التجديد التلقائي لشهاداتك عن طريق تشغيل هذا الأمر:

  1. sudo certbot renew --dry-run

سيكون الإخراج مشابهًا لهذا:

Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/your_domain.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator nginx, Installer nginx Renewing an existing certificate Performing the following challenges: http-01 challenge for monitoring.pp.ua Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of nginx server; fullchain is /etc/letsencrypt/live/your_domain/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/your_domain/fullchain.pem (success) ...

يرجى ملاحظة أنه إذا قمت بإنشاء شهادة مُجمعة تحتوي على عدة نطاقات، سيظهر اسم النطاق الأساسي فقط في الإخراج، ولكن التجديد سيعمل لجميع النطاقات المدرجة في هذه الشهادة.

A practical way to ensure your certificates will not get outdated is to create a cron job that will periodically execute the automatic renewal command for you. Since the renewal first checks for the expiration date and only executes the renewal if the certificate is less than 30 days away from expiration, it is safe to create a cron job that runs every week, or even every day.

قم بتعديل الـ crontab لإنشاء وظيفة جديدة ستعمل على تجديد الشهادة مرتين في اليوم. لتعديل الـ crontab لمستخدم الجذر، قم بتشغيل الأمر التالي:

  1. sudo crontab -e

سيفتح محرر النصوص الخاص بك ملف الـ crontab الافتراضي، الذي هو ملف نصي فارغ في هذه النقطة. ادخل في وضع الإدراج عن طريق الضغط على i وأضف السطر التالي:

crontab
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet

عند الانتهاء، اضغط على ESC للخروج من وضع الإدراج، ثم اكتب :wq واضغط على ENTER لحفظ التغييرات والخروج من الملف. لمعرفة المزيد عن محرر النصوص Vi وخليفته Vim، تفضل بزيارة الدليل التعليمي لدينا حول تثبيت واستخدام محرر النصوص Vim على خادم سحابي.

سينشئ هذا وظيفة cron جديدة تقوم بالتنفيذ في منتصف النهار ومنتصف الليل يوميًا. python -c 'import random; import time; time.sleep(random.random() * 3600)' سيختار دقيقة عشوائية داخل الساعة لمهام التجديد الخاصة بك.

الأمر renew لـ Certbot سيتحقق من جميع الشهادات المثبتة على النظام وسيحدث أي شهادة تنتهي صلاحيتها في أقل من ثلاثين يومًا. --quiet يُخبر Certbot بعدم إخراج المعلومات أو انتظار إدخال المستخدم.

يمكن العثور على مزيد من المعلومات المفصلة حول التجديد في توثيق Certbot.

الاستنتاج

في هذا الدليل، قمت بتثبيت عميل Let’s Encrypt Certbot، وقمت بتنزيل شهادات SSL لنطاقك، وأعدت إعداد تجديد الشهادة تلقائيًا. إذا كان لديك أي أسئلة حول استخدام Certbot، يمكنك التحقق من الـ توثيق Certbot الرسمي.

يمكنك أيضًا التحقق من مدونة Let’s Encrypt الرسمية للتحديثات المهمة من وقت لآخر.

Source:
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-rocky-linux-9