أخطاء شهادات SSL: تحذير "غير آمن" والمحتوى المختلط والشهادات المنتهية الصلاحية ومشاكل OCSP
يعني تحذير "غير آمن" (Not Secure) أن المتصفح لا يثق ثقة كاملة في اتصال HTTPS. ويرجع السبب إلى واحد من أربعة احتمالات: أن الشهادة منتهية الصلاحية، أو صادرة لاسم مضيف مختلف، أو موقّعة من جهة إصدار لا يستطيع المتصفح التحقق منها (غالبًا بسبب نقص الشهادة الوسيطة)، أو أن الشهادة سليمة لكن الصفحة تحمّل صورًا أو سكربتات أو ملفات تنسيق عبر http:// غير المشفّر (المحتوى المختلط). ولإصلاح المشكلة، حدّد أيّ الاحتمالات الأربعة ينطبق عليك، ثم أعد إصدار الشهادة أو جدّدها (عبر AutoSSL في cPanel، أو certbot على VPS)، وتأكد أن سيرفر الويب يقدّم الشهادة الجديدة مع سلسلتها الكاملة، وغيّر روابط http:// إلى https://.
ينطبق هذا الشرح على الاستضافة المشتركة بلوحة cPanel وعلى السيرفرات التي تعمل بنظام Ubuntu 22.04/24.04. كما يتناول أخطاء OCSP stapling.
المتطلبات
- صلاحية الدخول إلى cPanel في حالة الاستضافة المشتركة، أو صلاحية الدخول عبر SSH بحساب root/sudo إلى الـ VPS الخاص بك.
- صلاحية الوصول إلى منطقة DNS الخاصة بنطاقك.
- طرفية (Terminal) تتوفر فيها الأداتان
opensslوdig، وكلتاهما مضمّنتان في Ubuntu وmacOS وWSL.
1. ماذا يخبرك تحذير SSL في المتصفح فعليًا؟
اضغط على أيقونة التحذير في شريط العنوان، أو اقرأ رمز الخطأ الظاهر في صفحة التحذير:
- شهادة منتهية الصلاحية:
NET::ERR_CERT_DATE_INVALID(في Chrome) أوSEC_ERROR_EXPIRED_CERTIFICATE(في Firefox). معناه أن التجديد فشل، أو أن السيرفر ما زال يقدّم الملف القديم. تحقق أيضًا من أن ساعة جهاز الزائر مضبوطة. - اسم غير مطابق:
NET::ERR_CERT_COMMON_NAME_INVALIDأوSSL_ERROR_BAD_CERT_DOMAIN. معناه أن الشهادة لا تتضمن اسم المضيف هذا. ومن الحالات الشائعة شهادة تغطيexample.comولا تغطيwww.example.com. - جهة إصدار غير موثوقة:
NET::ERR_CERT_AUTHORITY_INVALIDأوSEC_ERROR_UNKNOWN_ISSUER. معناه أن الشهادة موقّعة ذاتيًا، أو أن سلسلة الشهادات الوسيطة ناقصة. - محتوى مختلط: لا تظهر صفحة خطأ، لكن أيقونة القفل تختفي أو تظهر عبارة "غير آمن". وتعرض وحدة التحكم في المتصفح (F12) الرسالة
Mixed Content: The page at ... was loaded over HTTPS, but requested an insecure resource.
2. لماذا لا يُصدر AutoSSL شهادة في cPanel؟
يثبت AutoSSL أنك تتحكم في النطاق عن طريق طلب ملف داخل المسار /.well-known/ عبر HTTP. ويفشل التحقق إذا لم يصل هذا الطلب إلى حساب الاستضافة الخاص بك.
تأكد من أن DNS يشير إلى سيرفر الاستضافة
نفّذ استعلامات البحث التالية وقارن نتائجها بعنوان IP الخاص بالسيرفر الظاهر في cPanel ضمن General Information:
dig +short example.com A
dig +short www.example.com A
dig +short example.com AAAA
dig +short example.com CAA
راجع كل نتيجة:
- إذا لم يُرجع
wwwأي نتيجة، فأضف سجل A أو سجل CNAME لـwww. - إذا كان هناك سجل AAAA يشير إلى سيرفر مختلف، فاحذفه أو صحّحه.
- إذا كان هناك سجل CAA، فيجب أن يسمح لجهة الإصدار (CA) التي تُصدر شهادتك، مثل
sectigo.comأوletsencrypt.org.
تأكد من أن ملف .htaccess لا يمنع التحقق
يفشل التحقق إذا كانت قواعد .htaccess تعيد توجيه الطلبات إلى نطاق آخر أو إلى صفحة صيانة، أو تمنع الوصول. استثنِ مسارات التحقق في الملف public_html/.htaccess:
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/\.well-known/(acme-challenge|pki-validation)/ [NC]
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
أعد تشغيل AutoSSL
- افتح cPanel » Security » SSL/TLS Status واضغط على Run AutoSSL.
- عند انتهاء العملية، راجع الحالة الظاهرة بجوار كل نطاق، إذ يظهر هناك سبب الفشل، مثل عدم تطابق DNS.
يمكن للموزعين (Resellers) أيضًا استخدام WHM » SSL/TLS » Manage AutoSSL. استخدم تبويب Manage Users لتشغيل الفحص لحساب واحد، وتبويب Logs للاطلاع على تفاصيل الأخطاء.
بعد إصدار الشهادة، يمكنك تفعيل Force HTTPS Redirect من cPanel » Domains » Domains.
3. لماذا انتهت صلاحية شهادة Let's Encrypt على الـ VPS؟
اعرف ما يقدّمه السيرفر فعليًا
يعرض هذا الأمر الشهادة التي يستلمها الزوار فعليًا، وليس مجرد الملفات الموجودة على القرص:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates -ext subjectAltName
تحقق من certbot ومؤقّت التجديد الخاص به
sudo certbot certificates
systemctl list-timers | grep -i certbot
sudo certbot renew --dry-run
إذا فشل التشغيل التجريبي، فاقرأ الملف /var/log/letsencrypt/letsencrypt.log. ثم تحقق من أداة المصادقة (authenticator) التي يستخدمها التجديد في الملف /etc/letsencrypt/renewal/example.com.conf. ومن أسباب الفشل المعتادة:
- المنفذ 80 مغلق. افتحه باستخدام
sudo ufw allow 80/tcp. - أداة المصادقة
standaloneتتعارض مع Nginx أو Apache، لأن كليهما يحتاج إلى المنفذ 80. أعد إصدار الشهادة باستخدامsudo certbot --nginx -d example.com -d www.example.com(أو--apache) حتى تعمل عمليات التجديد أثناء تشغيل سيرفر الويب.
تأكد من أن Nginx أو Apache يشير إلى ملفات live
sudo grep -R "ssl_certificate" /etc/nginx/
sudo grep -Ri "SSLCertificate" /etc/apache2/sites-enabled/
يجب أن تستخدم المسارات الروابط الرمزية (symlinks) داخل live كما في المثال أدناه. أما المسارات التي تشير إلى /etc/letsencrypt/archive/، أو إلى ملف منسوخ يدويًا في /etc/ssl/، فلا تتحدّث أبدًا عند تجديد الشهادة.
# Nginx
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Apache
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
أعد تحميل سيرفر الويب بعد كل تجديد
يحتفظ Nginx وApache بالشهادة القديمة في الذاكرة إلى أن تتم إعادة تحميلهما. يعيد خطاف النشر (deploy hook) التالي تحميل Nginx تلقائيًا بعد كل تجديد ناجح:
sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-web.sh > /dev/null <<'EOF'
#!/bin/sh
systemctl reload nginx
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-web.sh
sudo nginx -t && sudo systemctl reload nginx
في حالة Apache، استبدل سطر إعادة التحميل بـ systemctl reload apache2، واختبر الإعدادات باستخدام sudo apache2ctl configtest.
4. كيف أصلح تحذيرات المحتوى المختلط؟
في WordPress، اتبع الخطوات التالية:
- اضبط كلًّا من WordPress Address وSite Address على
https://من Settings » General. - استبدل روابط
http://المخزّنة في قاعدة البيانات باستخدام WP-CLI. الأمر الأول تشغيل تجريبي يكتفي بعرض ما سيتغيّر:cd ~/public_html wp search-replace 'http://example.com' 'https://example.com' --all-tables --dry-run wp search-replace 'http://example.com' 'https://example.com' --all-tables wp cache flush - راجع ملفات القالب وأكواد HTML المخصصة وإعدادات CDN بحثًا عن أي روابط
http://مكتوبة بشكل ثابت.
في المواقع التي لا تعمل بـ WordPress، أرسل الترويسة (header) التالية لتجعل المتصفحات ترقّي الطلبات المتبقية تلقائيًا:
Header always set Content-Security-Policy "upgrade-insecure-requests"
هذه هي الصيغة الخاصة بـ Apache/LiteSpeed. أما في Nginx، فاستخدم بدلًا منها add_header Content-Security-Policy "upgrade-insecure-requests" always;.
5. ماذا تعني رسالة "OCSP validation failed"؟
مع خاصية OCSP stapling، يجلب السيرفر من جهة الإصدار (CA) استجابة موقّعة تفيد بأن الشهادة "غير ملغاة"، ويرفقها بمصافحة TLS. وعادةً ما ترجع الأخطاء إلى أحد الأسباب التالية:
- الاتصالات الصادرة محظورة. يمنع جدار ناري السيرفر من الوصول إلى خادم استجابة OCSP التابع لجهة الإصدار على المنفذ 80.
- لا يوجد resolver في Nginx. بدون التوجيه
resolverلا يستطيع Nginx الاستعلام عن اسم مضيف خادم الاستجابة. - الاستجابة قديمة. ما زالت استجابة قديمة محفوظة في الذاكرة المؤقتة بعد استبدالك للشهادة.
- السلسلة غير صحيحة. الشهادة الوسيطة ناقصة أو غير صحيحة، فلا يمكن التحقق من الاستجابة المرفقة.
تحقق مما إذا كانت الشهادة تحتوي على رابط OCSP، وما إذا كان السيرفر يستطيع الوصول إليه، وما إذا كانت هناك استجابة مرفقة فعلًا:
sudo openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -ocsp_uri
curl -sI http://ocsp.example-ca.com # use the URL printed above
echo | openssl s_client -connect example.com:443 -servername example.com -status 2>/dev/null | grep -A3 "OCSP response"
تبدو إعدادات stapling الصحيحة في Nginx كالتالي:
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 1.1.1.1 8.8.8.8 valid=300s;
أعد تشغيل Nginx باستخدام sudo systemctl restart nginx لمسح الذاكرة المؤقتة الخاصة بـ stapling.
6. كيف أختبر إعدادات SSL باستخدام SSL Labs؟
أدخل نطاقك في https://www.ssllabs.com/ssltest/، وابحث عن النتائج التالية:
- "Chain issues: Incomplete": قدّم الملف
fullchain.pemبدلًا منcert.pem. - "Certificate name mismatch": أعد إصدار الشهادة مع تضمين جميع أسماء المضيف.
- نتيجة OCSP stapling: تؤكد ما إذا كانت إعدادات الخطوة 5 تعمل.
الحصول على تقييم A أو A+ يعني أن الإعدادات صحيحة.
تأكد من نجاح الإصلاح
- افتح الموقع في نافذة تصفح خاصة وتأكد من ظهور أيقونة القفل على
https://example.comوhttps://www.example.com. - أعد تنفيذ أمر
openssl s_clientمن الخطوة 3 وتأكد من أن قيمةnotAfterتاريخ مستقبلي وأن جميع أسماء المضيف مدرجة. - افتح وحدة التحكم في المتصفح (F12) وتأكد من عدم وجود رسائل "Mixed Content".
- على الـ VPS، تأكد من أن الأمر
sudo certbot renew --dry-runيُبلغ بالنجاح.
مشاكل شائعة
- يُظهر certbot شهادة مجدّدة، لكن المتصفحات ما زالت ترى الشهادة المنتهية ← لم تتم إعادة تحميل سيرفر الويب، أو أن إعداداته تشير إلى
archive/أو إلى ملف منسوخ. صحّح المسارات ثم أعد التحميل. - يُظهر AutoSSL الرسالة "DNS does not resolve to this server" ← صحّح سجلات A أو AAAA، وانتظر حتى يكتمل انتشار DNS، ثم اضغط على Run AutoSSL مرة أخرى.
- الشهادة صالحة على
example.comلكنها تُظهر خطأ علىwww← أضف سجل DNS لـwwwوأعد إصدار الشهادة. وعلى الـ VPS، أضف-d www.example.com. - بعض المتصفحات تُظهر أن الشهادة غير موثوقة وبعضها لا يُظهر ذلك ← سلسلة الشهادات الوسيطة ناقصة. قدّم الملف
fullchain.pem. - تظهر حلقة إعادة توجيه بعد فرض HTTPS خلف بروكسي أو CDN ← اضبط CDN على وضع SSL الكامل/الصارم (full/strict)، واحذف أي قواعد إعادة توجيه مكررة.
الأسئلة الشائعة
كم يستغرق AutoSSL لإصدار الشهادة؟
عادةً بضع دقائق بعد الضغط على Run AutoSSL، بشرط أن يكون DNS يشير بالفعل إلى السيرفر. وإذا كنت قد غيّرت DNS للتو، فامنح الانتشار وقتًا كافيًا أولًا.
هل يمكنني استخدام شهادتي المدفوعة بدلًا من AutoSSL؟
نعم. ثبّتها من cPanel » Security » SSL/TLS » Manage SSL sites مع تضمين حزمة CA (CA bundle). ولن يستبدل AutoSSL أي شهادة صالحة ثبّتها بنفسك.
هل أحتاج إلى OCSP stapling؟
لا. خاصية stapling اختيارية ولا تأثير لها على شهادات Let's Encrypt. وإذا تسببت في أخطاء، فإن إيقافها حل آمن.
تحتاج إلى مساعدة؟ إذا استمر فشل الشهادة بعد تنفيذ هذه الخطوات، افتح تذكرة دعم، واذكر فيها نطاقك ونص خطأ المتصفح أو مخرجات السجل كما هي بالضبط.