SSL و امنیت
رفع خطای your connection is not private و NET::ERR_CERT در مرورگر
خطای your connection is not private یعنی مرورگر گواهی SSL سایت را معتبر نمی داند و اتصال را قبل از باز شدن صفحه قطع کرده است. کد NET::ERR_CERT که زیر پیام می آید علت را مشخص می کند، و اگر فقط یک دستگاه خطا می گیرد مشکل از همان دستگاه است، نه از سایت.
خطای your connection is not private را کروم و مرورگرهای مبتنی بر آن نشان می دهند و معنایش این است که گواهی SSL سایت از نظر مرورگر معتبر نیست. زیر پیام یک کد می بینید، مثلا NET::ERR_CERT_DATE_INVALID یا NET::ERR_CERT_AUTHORITY_INVALID، و همین کد می گوید مشکل کجاست. اگر فقط روی یک کامپیوتر یا یک شبکه خطا می گیرید، اول تاریخ و ساعت دستگاه و آنتی ویروس را ببینید. اگر همه بازدیدکننده ها همین پیام را می گیرند، گواهی خود سایت منقضی شده، نام دامنه را پوشش نمی دهد یا زنجیره اش ناقص است.
اول مشخص کنید مشکل از دستگاه است یا از سایت
چهار آزمایش ساده در چند دقیقه جواب می دهد:
- سایت را با گوشی و اینترنت موبایل باز کنید. اگر باز شد، مشکل از شبکه یا کامپیوتر اول است.
- چند سایت HTTPS دیگر را باز کنید. اگر همه خطا می دهند، علت تقریبا قطعا ساعت دستگاه، آنتی ویروس یا شبکه است.
- صفحه را در پنجره ناشناس باز کنید تا افزونه ها و کش مرورگر کنار بروند.
- کد خطا را یادداشت کنید. جدول بخش بعد هر کد را به علتش وصل می کند.
اگر سایت از همه دستگاه ها خطا می دهد، به بخش علت های سمت صاحب سایت بروید.
علت های سمت بازدیدکننده
تاریخ و ساعت دستگاه اشتباه است
گواهی SSL تاریخ شروع و پایان دارد و مرورگر آن را با ساعت خود دستگاه مقایسه می کند. ساعتی که چند ماه یا چند سال عقب یا جلو است، حتی گواهی سالم را منقضی یا هنوز معتبر نشده نشان می دهد. معمولا کد NET::ERR_CERT_DATE_INVALID همراه با جمله ای درباره ساعت کامپیوتر می آید. در ویندوز از Settings، بخش Time & language، گزینه Set time automatically را روشن و Sync now را بزنید. باتری مادربرد خالی در کامپیوترهای قدیمی هم باعث برگشت ساعت بعد از هر خاموشی می شود.
آنتی ویروس یا نرم افزار امنیتی ترافیک HTTPS را اسکن می کند
بعضی آنتی ویروس ها گواهی خودشان را بین مرورگر و سایت می گذارند تا ترافیک را بخوانند. اگر آن گواهی درست نصب نشده یا منقضی شده باشد، همه سایت های HTTPS خطا می دهند و معمولا کد NET::ERR_CERT_AUTHORITY_INVALID می بینید. گزینه HTTPS scanning یا SSL scanning را در تنظیمات آنتی ویروس خاموش کنید و دوباره امتحان کنید. نمایش نام صادرکننده گواهی هم کمک می کند: روی علامت قفل یا هشدار کنار آدرس بزنید و صادرکننده را بخوانید. اگر نام آنتی ویروس را دیدید، علت پیدا شده است.
شبکه عمومی، پروکسی یا سیستم عامل قدیمی
وای فای کافه و فرودگاه گاهی ترافیک را تا ورود کاربر به یک صفحه ثبت نام تغییر مسیر می دهد. تا آن صفحه را کامل نکنید، همه سایت ها خطای گواهی می دهند. پروکسی شرکتی هم می تواند گواهی خودش را جایگزین کند. سیستم عامل بسیار قدیمی هم ممکن است گواهی ریشه جدید را نشناسد، که با به روز رسانی سیستم یا مرورگر درست می شود.
علت های سمت صاحب سایت
جدول زیر کد خطا را در کروم و فایرفاکس به علت وصل می کند:
| کد در کروم | کد در فایرفاکس | معنی |
|---|---|---|
NET::ERR_CERT_DATE_INVALID | SEC_ERROR_EXPIRED_CERTIFICATE | گواهی منقضی شده یا ساعت دستگاه غلط است |
NET::ERR_CERT_COMMON_NAME_INVALID | SSL_ERROR_BAD_CERT_DOMAIN | نام دامنه در گواهی نیست |
NET::ERR_CERT_AUTHORITY_INVALID | SEC_ERROR_UNKNOWN_ISSUER | زنجیره ناقص است یا صادرکننده شناخته نمی شود |
NET::ERR_CERT_AUTHORITY_INVALID | MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT | گواهی self-signed است |
برای دیدن وضعیت واقعی گواهی از ترمینال خودتان این دستورها را بزنید. به جای example.com دامنه را بنویسید:
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | grep -E "Verify return code|verify error"
دستور اول نام دامنه ها (subjectAltName)، صادرکننده و تاریخ شروع و پایان را چاپ می کند. گزینه -ext به OpenSSL نسخه 1.1.1 یا بالاتر نیاز دارد. دستور دوم نتیجه تایید زنجیره را نشان می دهد.
گواهی منقضی شده است
اگر notAfter در خروجی دستور اول گذشته باشد، گواهی منقضی است. روی هاست cPanel معمولا AutoSSL گواهی را خودکار تمدید می کند. علت تمدید نشدن را بخش SSL/TLS Status نشان می دهد و در مقاله رفع صادر نشدن AutoSSL و خطای DCV مرحله به مرحله آمده است. اگر گواهی را خودتان خریده اید یا با Certbot گرفته اید، تمدید دستی یا بررسی تایمر certbot لازم است و راه آن در نصب Let's Encrypt با Certbot روی Nginx و Apache آمده است.
نام دامنه با گواهی یکی نیست
گواهی فقط برای نام هایی معتبر است که در subjectAltName آمده اند. رایج ترین حالت ها این هاست:
- گواهی برای
example.comصادر شده و بازدیدکنندهwww.example.comرا باز می کند، یا برعکس. - گواهی wildcard مثل
*.example.comفقط یک سطح زیر دامنه را می پوشاند و خودexample.comرا شامل نمی شود. - دامنه تازه به هاست اشاره کرده و AutoSSL هنوز برایش گواهی صادر نکرده است. وقتی گواهی دامنه ای روی سرور نباشد، سرور گواهی پیش فرض هاست را می فرستد و اسم آن با دامنه شما نمی خواند.
- رکورد A دامنه هنوز به سرور قدیمی اشاره می کند و آن سرور گواهی دیگری دارد.
راه حل در همه این حالت ها یکی است: گواهی باید برای هر نامی که کاربر باز می کند صادر شود. در cPanel از SSL/TLS Status دامنه و زیر دامنه ها را انتخاب کنید و Run AutoSSL را بزنید. اگر رکورد A را تازه عوض کرده اید، چند ساعت صبر کنید تا DNS منتشر شود.
زنجیره گواهی ناقص است
مرورگر علاوه بر گواهی سایت به گواهی های واسط (intermediate) هم نیاز دارد تا به یک ریشه معتبر برسد. سرور باید گواهی سایت و واسط ها را با هم بفرستد. اگر فقط گواهی سایت نصب شده باشد، بعضی مرورگرها آن را می پذیرند و بعضی نه، و همین باعث می شود روی یک دستگاه کار کند و روی دیگری نه. در خروجی دستور دوم، unable to get local issuer certificate یا unable to verify the first certificate نشانه این حالت است.
در cPanel بخش SSL/TLS، گزینه Manage SSL sites، فیلد Certificate Authority Bundle (CABUNDLE) را بررسی کنید. اگر گواهی را دستی نصب کرده اید، این فیلد باید زنجیره صادرکننده را داشته باشد. روی سرورهای Nginx باید فایل fullchain.pem را در ssl_certificate بدهید، نه فایل cert.pem.
گواهی self-signed است
گواهی که صادرکننده و صاحبش یکی است، مرورگر را راضی نمی کند. روی هاست cPanel که AutoSSL هنوز اجرا نشده، گاهی گواهی self-signed موقت نصب است. با اجرای AutoSSL یا نصب گواهی معتبر عوض می شود.
دکمه Advanced و Proceed در صفحه خطا فقط برای سایتی است که خودتان می شناسید و می دانید چرا گواهی ندارد. به مشتری و بازدیدکننده نگویید از آن رد شود، چون ممکن است ترافیک واقعا در مسیر دستکاری شده باشد. اگر سایت HSTS فعال دارد، مرورگر این دکمه را اصلا نشان نمی دهد.
چطور مطمئن شویم مشکل حل شده است
بعد از نصب یا تمدید گواهی این موارد را بررسی کنید:
- دستور
openssl s_clientبالا را بزنید وVerify return code: 0 (ok)را ببینید. - هر چهار آدرس
http://example.com،http://www.example.com،https://example.comوhttps://www.example.comرا باز کنید. هر چهار باید بدون خطا به یک آدرس نهایی برسند. اگر ریدایرکت بین آن ها حلقه ساخت، رفع خطای ERR_TOO_MANY_REDIRECTS بعد از نصب SSL را ببینید. - صفحه را در پنجره ناشناس و با موبایل هم امتحان کنید تا کش مرورگر نتیجه را مخدوش نکند.
- اگر هنوز علامت قفل کامل نیست و هشدار محتوای ترکیبی می بینید، مشکل چیز دیگری است و راه حلش در رفع Mixed Content در وردپرس آمده است.
برای ریدایرکت اصولی از HTTP به HTTPS و انتخاب بین www و بدون www هم راهنمای ریدایرکت HTTPS و www با htaccess را بخوانید. گواهی هاست های cPanel پیکوهاست به صورت خودکار با AutoSSL صادر می شود و اگر صدور گیر کرد، تیکت پشتیبانی لاگ را بررسی می کند.
برای جزئیات فنی گواهی ها و زنجیره اعتماد می توانید مستندات Let's Encrypt درباره زنجیره گواهی را هم ببینید.