هذه من أكثر أعطال الشهادات إرباكًا لأنها تعمل عندك. فمتصفّحات سطح المكتب تخزّن الشهادات الوسيطة من مواقع أخرى وتسدّ الثغرة بصمت؛ أمّا هاتفٌ لم يرَ تلك الوسيطة قطّ، وكلُّ عميلِ سطر أوامر، فلا يستطيع.
العَرَض
- سليمٌ على حاسوبك المحمول، غيرُ موثوق على الهاتف.
- وcurl يقول unable to get local issuer certificate.
- وبوّابةُ دفعٍ أو خطّافُ ويب لا يستطيع الاتّصال بينما المتصفّحات راضية.
تأكّد منه
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com < /dev/null 2>/dev/null \
| grep -E '^ *[0-9]+ s:|Verify return code'
تريد أن ترى شهادتين على الأقل في القائمة — شهادتك والوسيطة — وأن يكون Verify return code: 0 (ok). وشهادةٌ واحدة مع خطأِ تحقّق هي هذا العطل بعينه.
والسببُ اسمُ ملفٍّ واحد
تقديمُ cert.pem بدل fullchain.pem. فـcert.pem شهادتك وحدها؛ وfullchain.pem شهادتك تتلوها الوسيطة. إنها كلمةٌ واحدة في الإعدادات، وهي المشكلةُ كلُّها في الغالب الأعمّ.
# nginx - correct
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# apache / litespeed
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
أعد التحميل وافحص ثانيةً
sudo nginx -t && sudo systemctl reload nginx
curl -sS -o /dev/null -w '%{http_code}\
' https://yourdomain.com
اختبِر من شيءٍ بلا تخزين
بأمر curl على جهازٍ لم يزُر الموقع قطّ، أو بهاتفٍ على بيانات الجوّال بعد مسح الموقع. فمتصفّحك أنت هو العميل الوحيد الذي لا يستطيع أن يخبرك بالجواب — انظر يعمل على الواي فاي ولا يعمل على بيانات الجوّال.