كيفية تأمين Nginx بشهادة SSL من Let's Encrypt عبر Certbot مع التجديد التلقائي
لتأمين Nginx بشهادة مجانية من Let's Encrypt، ثبّت Certbot من snap ثم شغّل sudo certbot --nginx -d example.com -d www.example.com. يتحقق Certbot من أنك تتحكم في النطاق، وينزّل الشهادة، ويضيف HTTPS وإعادة توجيه من HTTP إلى HTTPS إلى كتلة server الخاصة بـ Nginx، ويثبّت مؤقِّت systemd يجدد الشهادة تلقائيًا. يمكنك التأكد من أن التجديد يعمل باستخدام sudo certbot renew --dry-run.
ينطبق هذا الشرح على أي سيرفر يعمل بنظام Ubuntu 24.04 أو 22.04 ويشغّل Nginx، مثل VPS سحابي من Cloudesta أو سيرفر مخصص. إذا كنت تستخدم الاستضافة المشتركة بلوحة cPanel، فلن تحتاج إلى Certbot، لأن خاصية AutoSSL في cPanel تصدر الشهادات وتجددها نيابةً عنك.
المتطلبات الأساسية
- وصول SSH إلى السيرفر بصلاحيات root أو sudo.
- تثبيت Nginx وتشغيله (
sudo apt install nginx). - سجلات DNS من النوع A للنطاقين
example.comوwww.example.comتشير إلى عنوان IPv4 الخاص بسيرفرك، مثل203.0.113.10. - المنفذان 80 و443 مفتوحان على الإنترنت.
- كتلة server في Nginx يتضمن فيها
server_nameالنطاقات التي تريد إدراجها في الشهادة.
1. كيف أجهّز DNS والجدار الناري وكتلة server في Nginx؟
أولًا، تأكد من أن الاسمين يشيران إلى سيرفرك. يجب أن يطبع كل أمر عنوان IP الخاص بسيرفرك:
dig +short example.com A
dig +short www.example.com A
dig +short example.com AAAA
إذا كان UFW مفعّلًا، فاسمح بترافيك الويب. يفتح ملف التعريف Nginx Full المنفذين 80 و443 معًا. تأكد من بقاء SSH مسموحًا:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw status
بعد ذلك، أنشئ كتلة server أو عدّلها في المسار /etc/nginx/sites-available/example.com. تبدو الكتلة البسيطة التي تعمل عبر HTTP فقط هكذا:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
فعّل الموقع، واختبر الإعدادات، ثم أعد تحميل Nginx:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
2. كيف أثبّت Certbot على Ubuntu؟
يوصي مشروع Certbot باستخدام حزمة snap لأنها محدَّثة دائمًا وتأتي بمؤقِّت التجديد الخاص بها. إذا سبق أن ثبّت Certbot من apt، فأزل تلك النسخة أولًا حتى لا تتعارض النسختان:
sudo apt remove certbot python3-certbot-nginx
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
certbot --version
3. كيف أحصل على الشهادة وأفعّل HTTPS؟
شغّل Certbot مع إضافة Nginx واذكر كل اسم تريد أن تشمله الشهادة:
sudo certbot --nginx -d example.com -d www.example.com
في التشغيل الأول، يطلب Certbot عنوان بريد إلكتروني لإرسال إشعارات انتهاء الصلاحية، ويطلب منك قبول شروط الخدمة. لتشغيله دون أي أسئلة، من سكربت مثلًا، استخدم:
sudo certbot --nginx -d example.com -d www.example.com \
--agree-tos -m admin@example.com --redirect --no-eff-email
تضيف الإصدارات الحالية من Certbot إعادة التوجيه من HTTP إلى HTTPS افتراضيًا. وتمرير الخيار --redirect يجعل ذلك صريحًا في أي إصدار.
ما الذي يغيّره Certbot في إعدادات Nginx؟
يعدّل Certbot كتلة server مباشرةً ويضع على كل سطر يضيفه العلامة # managed by Certbot. تبدو النتيجة تقريبًا هكذا:
server {
server_name example.com www.example.com;
root /var/www/example.com;
...
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 404; # managed by Certbot
}
تُحفظ ملفات شهادتك في /etc/letsencrypt/live/example.com/، وتُحفظ إعدادات التجديد في /etc/letsencrypt/renewal/example.com.conf. لا تنقل هذه الملفات ولا تغيّر أسماءها، لأن التجديد يعتمد عليها.
4. كيف يعمل التجديد التلقائي؟
شهادات Let's Encrypt صالحة لمدة 90 يومًا. تثبّت حزمة snap مؤقِّت systemd يعمل مرتين يوميًا، فيجدد أي شهادة متبقٍّ على انتهائها 30 يومًا أو أقل، ثم يعيد تحميل Nginx. تأكد من أن المؤقِّت نشط:
systemctl list-timers | grep certbot
systemctl status snap.certbot.renew.timer
ثم نفّذ محاكاة للتجديد على سيرفر الاختبار (staging) التابع لـ Let's Encrypt. لا تُحتسب هذه المحاكاة ضمن حدود معدل الطلبات:
sudo certbot renew --dry-run
إذا انتهت المخرجات بالعبارة "Congratulations, all simulated renewals succeeded"، فهذا يعني أن التجديد التلقائي يعمل.
5. هل يمكنني الحصول على شهادة wildcard باستخدام Certbot؟
نعم، لكن لا يمكن التحقق من شهادة wildcard مثل *.example.com إلا عبر DNS، وليس عبر المنفذ 80. ستحتاج إلى إضافة DNS لـ Certbot خاصة بمزوّد DNS الذي تستخدمه، حتى يتمكن التجديد من إنشاء سجل TXT المطلوب تلقائيًا. على سبيل المثال، مع Cloudflare DNS:
sudo snap set certbot trust-plugin-with-root=ok
sudo snap install certbot-dns-cloudflare
sudo certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
-d example.com -d '*.example.com'
يجب أن يحتوي ملف بيانات الاعتماد على توكن API من Cloudflare، وينبغي تقييد صلاحياته باستخدام chmod 600. لا يعدّل الأمر certonly إعدادات Nginx، لذا عليك إضافة أسطر ssl_certificate بنفسك. تجنّب استخدام --manual مع شهادات wildcard، لأن الشهادات المُصدَرة يدويًا لا يمكن تجديدها تلقائيًا.
6. هل ينبغي إضافة HSTS وإعدادات TLS حديثة؟
يقصر الملف المُضمَّن options-ssl-nginx.conf الاتصالات بالفعل على TLS 1.2 و1.3 ويستخدم خوارزميات تشفير قوية. لا تكرر ssl_protocols أو ssl_ciphers في كتلة server نفسها، لأن Nginx سيرفض التوجيهات المكررة.
بعد أن يعمل HTTPS على كل النطاقات الفرعية التي تخدمها، يمكنك إضافة HSTS داخل كتلة server الخاصة بالمنفذ 443:
add_header Strict-Transport-Security "max-age=31536000" always;
max-age=300، ولا تُضِف includeSubDomains إلا بعد أن يحصل كل نطاق فرعي على شهادة صالحة.التحقق من أن كل شيء يعمل
curl -I http://example.com
curl -I https://example.com
sudo certbot certificates
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -subject -dates -ext subjectAltName
قارن كل نتيجة بالقائمة التالية، ثم افتح https://example.com في نافذة تصفح خاصة وتأكد من أن رمز القفل يعرض شهادة صادرة عن Let's Encrypt.
- يُرجع طلب HTTP الحالة
301 Moved Permanentlyمع إعادة التوجيه إلىhttps://. - يُرجع طلب HTTPS الحالة
200، أو رمز الحالة المعتاد لتطبيقك. - تتضمن قائمة subjectAltName كلًّا من
example.comوwww.example.com.
المشكلات الشائعة
- ظهور "Timeout during connect" أو "Connection refused" أثناء التحقق. المنفذ 80 محجوب أو أن DNS لا يشير إلى هذا السيرفر بعد. تحقق من
sudo ufw statusوdig +short example.com، وتأكد من عدم وجود سجل AAAA قديم. إذا غيّرت إعدادات DNS مؤخرًا، فانتظر حتى يكتمل انتشارها ثم أعد المحاولة. - ظهور "Could not automatically find a matching server block". لا توجد كتلة server مفعّلة تحتوي على
server_nameمطابق. أضف النطاق إلىserver_name، وشغّلsudo nginx -t، ثم أعد تحميل Nginx وشغّل Certbot مرة أخرى. - ظهور "Too many certificates already issued" أو "too many failed authorizations". لقد وصلت إلى أحد حدود معدل الطلبات في Let's Encrypt. هذه الحدود هي: 5 شهادات مكررة أسبوعيًا، و50 شهادة لكل نطاق مسجَّل أسبوعيًا، و5 محاولات تحقق فاشلة لكل اسم مضيف في الساعة. انتظر حتى يُعاد ضبط الحد، واختبر الإصلاحات أولًا باستخدام
--dry-runأو--staging. - يعرض المتصفح شهادة لنطاق خاطئ. الطلب يصل إلى كتلة server أخرى، وغالبًا ما تكون الكتلة الافتراضية. تحقق من
server_nameومنsudo certbot certificates. لإضافة أسماء إلى شهادة موجودة، شغّلsudo certbot --nginx --cert-name example.com -d example.com -d www.example.com -d shop.example.com. - يفشل التجديد بعد تعديل الإعدادات. من الأسباب الشائعة: وجود خطأ في إعدادات Nginx، أو حذف كتلة المنفذ 80، أو تغيير
server_name، أو وجود CDN يعمل كبروكسي ويحجب عملية التحقق. شغّلsudo nginx -tوsudo certbot renew --dry-run، ثم اطّلع على التفاصيل في/var/log/letsencrypt/letsencrypt.log.
الأسئلة الشائعة
ما مدة صلاحية شهادة Let's Encrypt؟
كل شهادة صالحة لمدة 90 يومًا. يجددها مؤقِّت Certbot تلقائيًا عندما يتبقى 30 يومًا أو أقل، لذا لن تحتاج أبدًا إلى تجديدها يدويًا.
هل أحتاج إلى إعادة تشغيل Nginx بعد التجديد؟
لا. عندما تكون الشهادة قد صدرت باستخدام --nginx، يعيد Certbot تحميل Nginx بنفسه بعد كل تجديد ناجح.
هل يمكنني استخدام Certbot على الاستضافة المشتركة بلوحة cPanel؟
لا، ولا حاجة إلى ذلك. على الاستضافة المشتركة، تصدر خاصية AutoSSL شهادات مجانية تلقائيًا، ويمكنك مراجعتها في cPanel من Security » SSL/TLS Status.
هل تحتاج إلى مساعدة؟ إذا استمر فشل التحقق أو لم تكن متأكدًا من إعداداتك، فافتح تذكرة دعم عبر https://cloudesta.com/submitticket.php وأرفق مخرجات خطأ Certbot كاملة. ويمكنك أيضًا تصفح المزيد من الشروحات في مكتبة الشروحات.