پیدا کردن علت هشدار SSL مرورگر برای سایت یکی از پرتکرارترین چالش‌های مدیران سرور و توسعه‌دهندگان است که مستقیماً بر اعتماد کاربر، نرخ پرش و سئو اثر می‌گذارد. مرورگرها به دلایل متعدد هشدار SSL نشان می‌دهند: تاریخ انقضا، Chain ناقص، Mixed Content، دامنه‌ی نامطابق یا CA ناشناس. هر هشدار، یک ریشه‌ی متفاوت دارد و بدون شناسایی دقیق، رفع مشکل ممکن است طولانی شود. در این راهنما، فرآیند مهندسی ریشه‌یابی هشدار SSL مرورگر، از تحلیل Trust Chain تا رفع Mixed Content و HSTS، بررسی می‌شود.

در یکی از پروژه‌ها، پس از نصب SSL، سایت همچنان در مرورگر «Not Secure» نمایش داده می‌شد. بررسی نشان داد که بخشی از تصاویر همچنان با HTTP بارگذاری می‌شدند. این تجربه نشان می‌دهد که ریشه‌یابی نیازمند رویکرد چندلایه است.

انواع هشدار SSL

هشدار ریشه شدت
NET::ERR_CERT_DATE_INVALID گواهی منقضی یا Not Yet Valid بالا
NET::ERR_CERT_AUTHORITY_INVALID CA ناشناس یا Chain ناقص بالا
NET::ERR_CERT_COMMON_NAME_INVALID دامنه مطابقت ندارد بالا
NET::ERR_CERT_REVOKED گواهی ابطال شده بالا
NET::ERR_SSL_PROTOCOL_ERROR پیکربندی TLS بالا
Mixed Content منابع HTTP در HTTPS متوسط
HSTS Warning پیکربندی نادرست HSTS متوسط
Too Many Redirects Redirect Loop بالا

شناسایی دقیق هشدار

  1. باز کردن صفحه در حالت Incognito.
  2. کلیک روی «Advanced» در هشدار.
  3. ثبت دقیق کد خطا.
  4. بررسی URL دقیق.
  5. بررسی Console DevTools.
  6. بررسی Network Tab.
# بررسی با curl
curl -vI https://example.com 2>&1 | grep -E "SSL|subject|issuer"

# بررسی Chain
openssl s_client -connect example.com:443 -servername example.com /dev/null | openssl x509 -noout -text

گواهی منقضی

رایج‌ترین علت هشدار SSL، انقضای گواهی است.

# بررسی تاریخ انقضا
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null 
  | openssl x509 -noout -dates

راه‌حل: تمدید گواهی و راه‌اندازی تمدید خودکار با Certbot.

# تمدید با Certbot
sudo certbot renew --force-renewal

# بررسی تمدید خودکار
sudo systemctl status certbot.timer
sudo certbot renew --dry-run

Chain ناقص

Chain ناقص یکی از شایع‌ترین مشکلات است که در Chrome نادیده گرفته می‌شود اما در Firefox و ابزارها خطا می‌دهد.

# بررسی Chain
openssl s_client -connect example.com:443 -showcerts

# بررسی تعداد گواهی‌ها در Chain
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | grep -c "BEGIN CERTIFICATE"

راه‌حل: نصب Chain کامل در سرور.

# Nginx
ssl_certificate /etc/ssl/fullchain.pem;  # شامل Server + Intermediate
ssl_certificate_key /etc/ssl/private.key;

# Apache
SSLCertificateFile /etc/ssl/cert.pem
SSLCertificateChainFile /etc/ssl/chain.pem
SSLCertificateKeyFile /etc/ssl/private.key

دامنه‌ی نامطابق

اگر دامنه در URL با CN یا SAN گواهی مطابقت نداشته باشد، هشدار نمایش داده می‌شود:

# بررسی SAN
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null 
  | openssl x509 -noout -text | grep -A 1 "Subject Alternative Name"

راه‌حل: صدور گواهی جدید با SAN صحیح، یا استفاده از Wildcard.

Mixed Content

Mixed Content زمانی رخ می‌دهد که صفحه HTTPS، منابع HTTP بارگذاری می‌کند.

# شناسایی Mixed Content در Chrome
1. F12 → Console
2. جستجوی "Mixed Content"

# شناسایی با ابزار
curl -s https://example.com | grep -E "src="http://|href="http://"

انواع Mixed Content

  • Passive: تصاویر، ویدئو، صوت.
  • Active: JavaScript، CSS، iframe.

راه‌حل: به‌روزرسانی تمام منابع به HTTPS.

# در WordPress
UPDATE wp_posts SET post_content = REPLACE(
  post_content, "http://example.com", "https://example.com"
);
UPDATE wp_postmeta SET meta_value = REPLACE(
  meta_value, "http://example.com", "https://example.com"
);
UPDATE wp_options SET option_value = REPLACE(
  option_value, "http://example.com", "https://example.com"
);

HSTS و مشکلات آن

HSTS (HTTP Strict Transport Security) اجبار HTTPS می‌کند. اما پیکربندی نادرست، می‌تواند به مشکلات زیر منجر شود:

  • Lock-out: اگر HSTS فعال باشد و گواهی نامعتبر، دسترسی مسدود می‌شود.
  • Subdomain Issues: includeSubDomains ممکن است برخی سرویس‌ها را مسدود کند.
  • Preload: حذف از Preload List طولانی است.
# بررسی HSTS
curl -sI https://example.com | grep -i strict

# پاک‌سازی HSTS در Chrome
chrome://net-internals/#hsts → Delete domain

پیکربندی TLS

پیکربندی نامناسب TLS می‌تواند به هشدار منجر شود:

  • فعال بودن TLS 1.0 یا 1.1.
  • الگوریتم‌های ضعیف (RC4، 3DES).
  • عدم پشتیبانی از SNI.
  • Cipher Suite ناسازگار.
# بررسی TLS Version
nmap --script ssl-enum-ciphers -p 443 example.com

# بررسی با testssl.sh
./testssl.sh example.com

فرآیند عیب‌یابی سیستماتیک

  1. ثبت دقیق هشدار: کد خطا و URL.
  2. بررسی تاریخ انقضا: با openssl.
  3. بررسی Chain: با openssl s_client.
  4. بررسی SAN: تطابق دامنه.
  5. بررسی Mixed Content: در Console.
  6. بررسی TLS: با SSL Labs.
  7. بررسی HSTS: در Header.
  8. تست Cross-Browser: Chrome، Firefox، Safari.
  9. رفع مشکل: بر اساس ریشه.
  10. اعتبارسنجی: تست مجدد.

پرسش‌های پرتکرار

چرا سایت در Chrome امن است اما در Firefox هشدار دارد؟

Firefox از Trust Store مستقل استفاده می‌کند. معمولاً Chain ناقص است.

چگونه Mixed Content را پیدا کنیم؟

با Console DevTools یا ابزارهای آنلاین مانند Why No Padlock.

آیا HSTS می‌تواند سایت را مسدود کند؟

بله، اگر گواهی نامعتبر باشد و HSTS فعال، دسترسی مسدود می‌شود.

چگونه گواهی منقضی را تمدید کنیم؟

با Certbot یا ابزار ACME مشابه.

آیا پس از رفع مشکل، Cache مرورگر پاک می‌شود؟

خیر، ممکن است نیاز به پاک‌سازی دستی Cache داشته باشید.

چرا پس از نصب SSL، Redirect Loop رخ می‌دهد؟

معمولاً به‌دلیل پیکربندی نادرست Redirect یا CDN. برای مطالعه‌ی بیشتر، پست چرا ریدایرکت HTTPS در .htaccess کار نمی‌کند مفید است.

اشتباهات رایج

اشتباه علت راه‌حل
نصب گواهی بدون Chain فرض نصب صحیح نصب fullchain.pem
عدم به‌روزرسانی منابع HTTP Mixed Content Search-Replace در دیتابیس
فراموشی تمدید گواهی عدم تمدید خودکار Certbot renew
پیکربندی نادرست HSTS عدم درک includeSubDomains بررسی Preload List
فعال بودن TLS 1.0 پیکربندی قدیمی TLS 1.2 و 1.3 فقط
عدم تست Cross-Browser فرض یکسان بودن تست در Chrome، Firefox، Safari
عدم بررسی CDN فرض پیکربندی مستقیم بررسی CDN SSL Settings

ملاحظات پیشرفته

در سطح معماری، رفع هشدار SSL نیازمند استراتژی جامع است:

۱. Certificate Monitoring: پایش خودکار تاریخ انقضا.

۲. Automated Renewal: با Certbot و ACME.

۳. Multi-Layer Testing: Chrome، Firefox، Safari، curl.

۴. CDN Configuration: هماهنگی SSL در CDN.

۵. HSTS Preload: با احتیاط.

۶. OCSP Stapling: فعال‌سازی.

۷. TLS 1.3: تنها نسخه‌ی مدرن.

۸. Certificate Transparency: پایش CT Logs.

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

نتیجه

پیدا کردن علت هشدار SSL مرورگر، یک فرآیند عیب‌یابی سیستماتیک است که با شناسایی دقیق هشدار، بررسی Trust Chain، Mixed Content و پیکربندی TLS انجام می‌شود. شناخت انواع هشدار و ریشه‌ی آن‌ها، زمان رفع مشکل را کاهش می‌دهد. ابزارهایی مانند openssl، SSL Labs و testssl.sh، بررسی جامع‌تری فراهم می‌کنند.

💡 اگر تجربه‌ای در رفع هشدار SSL داشته‌اید، برای ما جالب است بدانیم کدام ریشه بیشترین زمان را از شما گرفت: Chain ناقص، Mixed Content یا HSTS. تجربه‌ی خودتان را در دیدگاه‌ها بنویسید.