عیب‌یابی خطای SSL در مرورگر؛ از زنجیره ناقص تا گواهی منقضی

راهنمای عملی برای رفع خطای SSL در مرورگر: بررسی زنجیره گواهی، عدم تطابق نام دامنه، گواهی منقضی و خطاهای رایج با دستورات دقیق.

۶ دقیقه به‌روزرسانی ۲۱ مهر ۱۴۰۵

چرا خطای SSL در مرورگر ظاهر می‌شود؟

وقتی کاربری با خطای SSL در مرورگر مواجه می‌شود، معمولاً اولین واکنش این است که «مشکل از مرورگر است» یا «گواهی خراب شده». اما در بیشتر موارد، ریشه مشکل جای دیگری است: زنجیره‌ی ناقص گواهی، عدم تطابق نام دامنه، یا گواهی منقضی. در این مقاله، هر سه حالت را با جزئیات فنی بررسی می‌کنیم و راهکار عملی برای هر کدام ارائه می‌دهیم. اگر مدیر سایت هستید یا روی زیرساخت ابری کار می‌کنید، این راهنما به شما کمک می‌کند تا خطای SSL را در کمترین زمان شناسایی و رفع کنید.

۱. زنجیره‌ی ناقص گواهی (Incomplete Certificate Chain)

زنجیره‌ی گواهی، مسیری است که از گواهی سرور به گواهی ریشه (Root CA) می‌رسد. اگر این زنجیره ناقص باشد، مرورگر نمی‌تواند اعتبار گواهی را تأیید کند و خطای SSL نشان می‌دهد. این مشکل اغلب زمانی رخ می‌دهد که گواهی‌های میانی (Intermediate Certificates) روی سرور نصب نشده‌اند.

چگونه زنجیره را بررسی کنیم؟

با دستور زیر می‌توانید زنجیره‌ی گواهی را از دید سرور بررسی کنید:

openssl s_client -connect example.com:443 -showcerts

خروجی این دستور شامل تمام گواهی‌هایی است که سرور ارسال می‌کند. اگر فقط یک گواهی (گواهی سرور) در خروجی دیدید و گواهی‌های میانی وجود نداشتند، یعنی زنجیره ناقص است. در خروجی، به بخش‌های Certificate chain دقت کنید. اگر فقط یک بلوک BEGIN CERTIFICATE دیدید، مشکل تأیید می‌شود.

راهکار: نصب گواهی‌های میانی

بیشتر مراجع صدور گواهی (CAها)، فایل‌های گواهی میانی را به همراه گواهی اصلی دانلود می‌کنند. برای وب‌سرور Nginx، باید گواهی میانی را به فایل گواهی اصلی اضافه کنید:

cat example.com.crt intermediate.crt > fullchain.crt

سپس در تنظیمات Nginx، مسیر ssl_certificate را به فایل fullchain.crt تغییر دهید و سرویس را ری‌استارت کنید:

sudo systemctl restart nginx

برای Apache نیز فایل SSLCertificateChainFile را به گواهی میانی اشاره دهید. بعد از تغییر، حتماً با دستور openssl s_client دوباره بررسی کنید که حداقل دو یا سه گواهی در زنجیره ارسال می‌شود.

اشتباه رایج: برخی گواهی‌های میانی را به‌جای اضافه کردن به فایل گواهی، در مسیر اشتباه قرار می‌دهند یا فایل را با فرمت اشتباه (مثلاً DER به‌جای PEM) ذخیره می‌کنند. همیشه مطمئن شوید فایل‌ها با فرمت PEM (متن‌باز با هدر BEGIN CERTIFICATE) هستند.

۲. عدم تطابق نام دامنه (Hostname Mismatch)

یکی دیگر از دلایل رایج خطای SSL، عدم تطابق بین نام دامنه‌ای که کاربر در مرورگر وارد می‌کند و نام دامنه‌ای است که در گواهی ثبت شده. این خطا معمولاً با پیام «نام امنیتی نامعتبر است» یا «گواهی برای این سایت صادر نشده» نمایش داده می‌شود.

انواع عدم تطابق

  • دامنه اصلی در برابر زیردامنه: گواهی برای example.com صادر شده اما کاربر به www.example.com مراجعه می‌کند.
  • دامنه‌های مشابه: گواهی برای example.com است اما کاربر به example.org می‌رود.
  • آدرس IP مستقیم: کاربر با آدرس IP به سایت دسترسی پیدا می‌کند، در حالی که گواهی فقط برای نام دامنه صادر شده.

بررسی با دستور openssl

برای بررسی اینکه گواهی برای کدام دامنه‌ها صادر شده، از دستور زیر استفاده کنید:

openssl x509 -in certificate.crt -noout -text | grep -A 1 "Subject Alternative Name"

خروجی شامل لیست دامنه‌های معتبر است. اگر دامنه‌ی مورد نظر در این لیست نبود، مشکل از گواهی است.

راهکارها

  1. گواهی جدید با دامنه صحیح: اگر گواهی برای دامنه اشتباه صادر شده، باید گواهی جدیدی با نام دامنه درست دریافت کنید.
  2. تنظیم ریدایرکت: اگر گواهی برای example.com است اما کاربران به www.example.com می‌روند، یک ریدایرکت 301 از www به دامنه اصلی تنظیم کنید:
server {
    listen 443 ssl;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

این کار باعث می‌شود کاربران همیشه به دامنه‌ای هدایت شوند که گواهی برای آن معتبر است.

اشتباه رایج: برخی مدیران سایت، گواهی را برای دامنه بدون www صادر می‌کنند اما فراموش می‌کنند که ریدایرکت تنظیم کنند. نتیجه: کاربرانی که با www وارد می‌شوند، خطای SSL می‌بینند. همیشه بعد از نصب گواهی، هر دو حالت (با و بدون www) را تست کنید.

۳. گواهی منقضی (Expired Certificate)

گواهی‌های SSL تاریخ انقضا دارند و معمولاً بین ۱ تا ۲ سال اعتبار دارند. وقتی گواهی منقضی می‌شود، مرورگر خطای «گواهی امنیتی منقضی شده» نشان می‌دهد. این مشکل ساده‌ترین حالت است اما اگر به‌موقع تشخیص داده نشود، می‌تواند باعث از دست رفتن اعتماد کاربران شود.

بررسی تاریخ انقضا

با دستور زیر می‌توانید تاریخ انقضای گواهی را از راه دور بررسی کنید:

echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates

خروجی شامل دو تاریخ است: notBefore (تاریخ شروع اعتبار) و notAfter (تاریخ انقضا). اگر تاریخ فعلی بعد از notAfter باشد، گواهی منقضی است.

راهکار: تمدید خودکار

بهترین راه برای جلوگیری از این مشکل، استفاده از تمدید خودکار است. اگر از Let's Encrypt استفاده می‌کنید، با cronjob زیر می‌توانید تمدید خودکار را تنظیم کنید:

0 3 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"

این دستور هر روز ساعت ۳ صبح بررسی می‌کند که آیا گواهی در حال انقضا است (کمتر از ۳۰ روز مانده) و در صورت نیاز آن را تمدید می‌کند. برای گواهی‌های خریداری‌شده از CAهای تجاری، معمولاً می‌توانید یادآور ایمیلی تنظیم کنید یا از API مرجع صدور گواهی برای تمدید خودکار استفاده کنید.

اشتباه رایج: برخی مدیران سایت، گواهی را تمدید می‌کنند اما فراموش می‌کنند فایل گواهی جدید را روی سرور جایگزین کنند. بعد از تمدید، حتماً فایل‌های جدید را دانلود و روی سرور نصب کنید و سرویس وب را ری‌استارت کنید.

۴. سایر خطاهای SSL که باید بشناسید

علاوه بر سه مشکل اصلی، خطاهای دیگری نیز وجود دارند که ممکن است با آنها مواجه شوید:

گواهی خودامضا (Self-Signed Certificate)

اگر گواهی توسط یک CA معتبر صادر نشده باشد (مثلاً برای محیط تست)، مرورگر خطای «اتصال امن نیست» نشان می‌دهد. برای محیط تولید، هرگز از گواهی خودامضا استفاده نکنید. برای تست، می‌توانید گواهی خودامضا بسازید اما در مرورگر آن را به‌عنوان استثنا اضافه کنید.

پروتکل‌های قدیمی TLS

اگر سرور شما فقط از TLS 1.0 یا TLS 1.1 پشتیبانی کند، مرورگرهای مدرن خطا نشان می‌دهند. برای بررسی نسخه‌های TLS پشتیبانی‌شده:

openssl s_client -connect example.com:443 -tls1_2

اگر این دستور خطا داد، یعنی TLS 1.2 پشتیبانی نمی‌شود. در Nginx، می‌توانید پروتکل‌های مجاز را تنظیم کنید:

ssl_protocols TLSv1.2 TLSv1.3;

عدم تطابق تاریخ سیستم

اگر تاریخ و ساعت سیستم کاربر (یا سرور) اشتباه باشد، مرورگر ممکن است خطای SSL نشان دهد. این مشکل کمتر رایج است اما اگر همه‌چیز درست به نظر می‌رسد، تاریخ سیستم را بررسی کنید.

۵. ابزارهای کمکی برای عیب‌یابی خطای SSL

برای تشخیص سریع‌تر مشکلات، از ابزارهای زیر استفاده کنید:

  • SSL Labs (ssllabs.com): تحلیل کامل گواهی و پیکربندی سرور را ارائه می‌دهد.
  • Why No Padlock (whynopadlock.com): برای پیدا کردن محتوای mixed content که باعث خطای SSL می‌شود.
  • curl با گزینه‌های دقیق: برای بررسی خطاها از دید خط فرمان:
curl -vI https://example.com 2>&1 | grep "SSL"

این دستور جزئیات کامل فرآیند handshake را نشان می‌دهد و می‌تواند خطاهای خاصی مثل ناتوانی در دریافت گواهی میانی را مشخص کند.

۶. جمع‌بندی و پیشگیری

خطای SSL در مرورگر معمولاً از سه منبع اصلی نشأت می‌گیرد: زنجیره‌ی ناقص، عدم تطابق نام دامنه، و گواهی منقضی. با بررسی منظم این سه مورد، می‌توانید از بروز خطا جلوگیری کنید. پیشنهاد می‌کنیم یک چک‌لیست ماهانه داشته باشید:

  1. بررسی تاریخ انقضای گواهی با openssl
  2. بررسی زنجیره گواهی با openssl s_client -showcerts
  3. تست دسترسی با و بدون www
  4. بررسی نسخه‌های TLS پشتیبانی‌شده

اگر از زیرساخت ابری استفاده می‌کنید، ServerNet امکان مدیریت گواهی‌های SSL را در پنل کاربری فراهم کرده است که می‌تواند فرآیند نصب و تمدید را ساده‌تر کند. اما در هر صورت، آشنایی با این دستورات و مفاهیم به شما کمک می‌کند تا در هر شرایطی مشکل را سریع حل کنید.

در نهایت، به یاد داشته باشید که خطای SSL فقط یک پیام خطا نیست؛ نشانه‌ای است از یک مشکل فنی که اگر به‌موقع رفع نشود، می‌تواند اعتماد کاربران را از بین ببرد و حتی روی سئوی سایت تأثیر منفی بگذارد. با بررسی منظم و استفاده از ابزارهای معرفی‌شده، می‌توانید مطمئن شوید که سایت شما همیشه با اتصال امن در دسترس است.

آیا این مطلب برایتان مفید بود؟