مشتری زنگ می‌زند و می‌گوید: «بازدیدکننده‌ها می‌گویند سایت شما ویروسی است.» وارد می‌شوم، مرورگر یک صفحهٔ قرمز با تیتر «اتصال شما امن نیست» نشان می‌دهد. فروشگاه دو روز است فروش نداشته و صاحب سایت فکر می‌کند هک شده؛ در واقع فقط گواهی SSL (Secure Sockets Layer) سایت دو روز پیش منقضی شده بوده. تجربه‌ام می‌گوید پشت هر خطای SSL در وردپرس، یکی از پنج علت مشخص قرار دارد؛ شناخت این پنج علت، تفاوت بین پنج دقیقه رفع و پنج روز سرگردانی است.

خطای SSL چیست و چرا مرورگر به آن گیر می‌دهد؟

SSL یک پروتکل رمزنگاری است که ارتباط بین مرورگر و سرور را امن می‌کند؛ نسخهٔ امروزی و توصیه‌شدهٔ آن TLS (Transport Layer Security) نامیده می‌شود، ولی در ادبیات عمومی وب هر دو با نام SSL شناخته می‌شوند. برای فعال شدن این لایهٔ امنیتی، سرور باید یک «گواهی دیجیتال» (Digital Certificate) داشته باشد که توسط یک مرجع صدور گواهی (CA یا Certificate Authority) امضا شده است. مرورگرها به‌طور پیش‌فرض به فهرست مشخصی از CAهای معتبر اعتماد می‌کنند — از Let's Encrypt تا DigiCert.

وقتی مرورگر به سایت HTTPS وصل می‌شود، سه چیز را بررسی می‌کند: آیا گواهی معتبر است؟ آیا منقضی نشده؟ آیا برای همین دامنه صادر شده؟ اگر پاسخ هر یک از این سه سؤال «نه» باشد، مرورگر یا صفحهٔ هشدار نشان می‌دهد یا (در موارد شدیدتر) اتصال را کامل قطع می‌کند. آن صفحهٔ قرمز رنگ که همه ما دیده‌ایم، یک هشدار امنیتی است؛ نه یک پیام فنی. اما از دید کسب‌وکار، این هشدار یعنی ترافیک، اعتماد و فروش از دست می‌رود.

اگر تازه با مفاهیم پایه آشنایی ندارید، پیش از هر چیز توصیه می‌کنم مقالهٔ SSL چیست و چرا سایت به آن نیاز دارد را بخوانید؛ در آنجا تفاوت HTTP و HTTPS و نقش گواهی در امنیت سایت توضیح داده شده. تفاوت دقیق HTTPS و HTTP هم در HTTPS چیست و چه تفاوتی با HTTP دارد با مثال‌های عملی آمده است.

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

انواع خطای SSL در وردپرس

در جلسه‌های پشتیبانی، خطاها را در چهار دستهٔ کلی می‌بینم:

  • NET::ERR_CERT_DATE_INVALID: تاریخ گواهی منقضی شده یا هنوز فعال نشده است. رایج‌ترین نوع؛ معمولاً با یادآوری تمدید حل می‌شود.
  • NET::ERR_CERT_COMMON_NAME_INVALID: گواهی معتبر است ولی برای دامنهٔ دیگری صادر شده — مثلاً گواهی روی example.com ثبت شده ولی کاربر به www.example.com می‌رسد.
  • NET::ERR_CERT_AUTHORITY_INVALID: گواهی توسط مرجع ناشناخته امضا شده یا گواهی خودامضا (Self-signed) است.
  • ERR_SSL_PROTOCOL_ERROR: مشکل در پیکربندی سرور؛ معمولاً به فعال‌سازی اشتباه یا ناقص ماژول SSL در Apache/Nginx مربوط است.

و یک خطای ظاهراً بی‌ربط اما مرتبط: «اعلان محتوای ناامن» یا Mixed Content. در این حالت صفحه اصلی با HTTPS بالا می‌آید ولی بخشی از منابع (تصویر، اسکریپت، استایل) از نشانی HTTP بارگذاری می‌شود. این هم به‌نوعی خطای SSL است — فقط مرورگر آن را ملایم‌تر گزارش می‌دهد. به آن در بخش جداگانه خواهم پرداخت.

پنج علت رایج خطای SSL در وردپرس

در تجربه‌ام، این پنج علت تقریباً تمام پرونده‌ها را پوشش می‌دهند:

  1. انقضای گواهی: گواهی‌های Let's Encrypt هر ۹۰ روز منقضی می‌شوند. اگر تمدید خودکار خراب شود، روز نود و یکم، سایت از HTTPS سقوط می‌کند. تشخیص سریع: در مرورگر، روی قفل کنار آدرس کلیک کنید و تاریخ اعتبار را ببینید.
  2. عدم تطابق دامنه: کاربر با www.example.com وارد می‌شود ولی گواهی روی example.com صادر شده (یا برعکس). راه‌حل: گواهی را برای هر دو دامنه یا با گواهی Wildcard بگیرید — جزئیاتش در SSL Wildcard چیست و چه کاربردی دارد آمده است.
  3. پیکربندی اشتباه Site URL و Home URL در وردپرس: اگر این دو مقدار در دیتابیس با HTTP ثبت شده باشند ولی سایت روی HTTPS سرو می‌شود، حلقهٔ ریدایرکت و محتوای ترکیبی رخ می‌دهد.
  4. نصب ناقص گواهی روی سرور: گاهی فایل گواهی نصب شده ولی زنجیرهٔ CA (Certificate Chain) کامل نیست. مرورگر رومیزی شاید عبور کند ولی مرورگر موبایل یا ابزارهای خط فرمان رد می‌کنند.
  5. پروکسی میانی یا CDN با پیکربندی اشتباه: اگر CDN (Content Delivery Network) دارید و حالت SSL روی «Flexible» تنظیم شده باشد، مرورگر تا CDN امن است ولی از CDN به سرور، ترافیک HTTP می‌شود؛ نتیجه، حلقهٔ ریدایرکت بی‌پایان.

جدول زیر برای تشخیص سریع در جلسه‌های عیب‌یابی همیشه کمک کرده:

پیام خطامحتمل‌ترین علتاولین اقدام
CERT_DATE_INVALIDانقضای گواهیتمدید فوری از پنل هاست یا CA
COMMON_NAME_INVALIDعدم تطابق دامنه www یا بدون wwwصدور گواهی جدید یا Wildcard
AUTHORITY_INVALIDگواهی خودامضا یا ناقصنصب زنجیرهٔ CA و گواهی معتبر
حلقهٔ ریدایرکت بی‌پایانتنظیم اشتباه CDN یا Site URLبازبینی حالت SSL در CDN و دیتابیس
Mixed Content در کنسولمنابع HTTP روی صفحهٔ HTTPSجست‌وجو و جایگزینی URLهای HTTP

چطور خطای SSL را دقیق تشخیص دهیم؟

پیش از هر اقدامی، دقیقاً بفهمید با کدام نوع خطا طرفید. سه ابزار در جعبه‌ابزار من همیشه حاضرند:

ابزار اول: مرورگر و صفحهٔ هشدار

در کروم، با کلیک روی «Advanced» یا «Not secure»، جزئیات بیشتری نمایش داده می‌شود. در فایرفاکس، دکمهٔ «Advanced» و سپس «View Certificate» تاریخ انقضا و مرجع صدور را نشان می‌دهد. این اولین قدم در هر پرونده است.

ابزار دوم: SSL Labs Server Test

سرویس رایگان Qualys SSL Labs (قابل دسترسی در ssllabs.com/ssltest) بهترین گزارش تخصصی است. هم‌زمان زنجیرهٔ گواهی، پشتیبانی از پروتکل‌های قدیمی، و امتیاز کلی (A تا F) را نشان می‌دهد. اگر امتیاز زیر B دیدید، حتی بدون خطای ظاهری هم سایت شما آماده بهینه‌سازی است.

ابزار سوم: OpenSSL در خط فرمان

برای بررسی سریع روی سرور یا سیستم محلی، این دستور در ترمینال، اطلاعات گواهی و تاریخ انقضا را نشان می‌دهد:

openssl s_client -connect example.com:443 -servername example.com

اگر گواهی روی سرور نصب ولی در CDN یا پروکسی دیگری مشکل باشد، این ابزار می‌تواند تفاوت را لو بدهد. برای بررسی دقیق‌تر گواهی نصب‌شده روی سایت، راهنمای بررسی اعتبار SSL سایت مسیر گام‌به‌گام را نشان می‌دهد.

در عیب‌یابی SSL، اولین سؤال همیشه این است: گواهی کجاست؟ روی سرور اصلی، روی CDN، یا روی هر دو؟ بدون پاسخ این سؤال، هر تلاشی حدس است.

رفع خطای SSL: راه‌حل‌های گام‌به‌گام

بسته به علت، یکی از مسیرهای زیر را انتخاب کنید.

مسیر اول: تمدید گواهی

اگر گواهی منقضی شده، این سریع‌ترین مسیر است. اگر از Let's Encrypt استفاده می‌کنید، در اکثر پنل‌های هاست (cPanel، DirectAdmin) یک گزینهٔ «Renew» وجود دارد. اگر گواهی تجاری دارید، وارد پنل CA شوید و تمدید کنید. پس از تمدید، سرور را ری‌استارت کنید یا از پنل، سرویس SSL را دوباره راه‌اندازی کنید. روش نصب مجدد را در چگونه SSL سایت را نصب و فعال کنیم گام‌به‌گام توضیح داده‌ام.

مسیر دوم: رفع مشکل عدم تطابق دامنه

اگر گواهی برای دامنهٔ اشتباه صادر شده، سه راه دارید: صدور گواهی جدید برای دامنهٔ صحیح، صدور گواهی Wildcard برای پوشش زیردامنه‌ها، یا اعمال ریدایرکت دائمی از نسخهٔ بدون www به نسخهٔ با www (یا برعکس) تا همهٔ کاربران روی دامنهٔ درست قرار بگیرند. مقایسهٔ گواهی رایگان و پولی برای انتخاب درست را در گواهی SSL رایگان و پولی چه تفاوتی دارند آورده‌ام.

مسیر سوم: اصلاح Site URL و Home URL

اگر وردپرس با نشانی HTTP ثبت شده، باید این دو مقدار در دیتابیس اصلاح شوند. سریع‌ترین راه از طریق wp-config.php است؛ دو خط زیر را موقتاً اضافه کنید:

define( 'WP_HOME', 'https://example.com' );
define( 'WP_SITEURL', 'https://example.com' );

بعد از تأیید کارکرد سایت، از پنل وردپرس (تنظیمات ← عمومی) این مقادیر را دائمی کنید و این دو خط را از فایل حذف کنید. اگر تعداد لینک‌های HTTP در دیتابیس زیاد است، از افزونهٔ Search-Replace استفاده کنید — نه از Find/Replace مستقیم روی فایل SQL که به سریالایز شدن داده‌ها آسیب می‌زند.

مسیر چهارم: رفع حلقهٔ ریدایرکت

اگر سایت بین HTTP و HTTPS بی‌پایان می‌چرخد، شایع‌ترین مقصر، تنظیم اشتباه CDN است. در Cloudflare (و معادل‌های دیگر)، حالت SSL باید روی «Full» یا «Full (Strict)» باشد، نه «Flexible». اگر Flexible باشد، CDN با کاربر HTTPS صحبت می‌کند ولی با سرور شما HTTP؛ نتیجه، بازگشت به ابتدای چرخه. اگر با CDN کار نمی‌کنید، قواعد ریدایرکت در فایل .htaccess را بازبینی کنید که دوبار ریدایرکت نکند. تفصیل این موضوع در خطای ریدایرکت شدن مداوم وردپرس آمده است.

مسیر پنجم: اعمال ریدایرکت دائمی HTTP به HTTPS

اگر همه‌چیز درست است ولی می‌خواهید کاربران HTTP را به HTTPS هدایت کنید، سه راه دارید: تنظیم در پنل هاست، افزودن قاعده در .htaccess یا نصب افزونهٔ مخصوص. روش استاندارد در ریدایرکت HTTP به HTTPS چگونه انجام می‌شود توضیح داده شده است. قاعدهٔ پیشنهادی در .htaccess:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

پروندهٔ خاص: محتوای ترکیبی (Mixed Content)

محتوای ترکیبی وضعیتی است که صفحهٔ اصلی با HTTPS سرو می‌شود، ولی بعضی منابع (تصویر، فایل CSS، اسکریپت) از نشانی HTTP بارگذاری می‌شوند. مرورگر، آیکون قفل را با هشدار «Not fully secure» جایگزین می‌کند و بعضی مرورگرها اسکریپت‌های HTTP را کاملاً مسدود می‌کنند. از دید کاربر، سایت «کار می‌کند» ولی حسِ امنیت از بین می‌رود.

سه گام برای رفع محتوای ترکیبی:

  1. شناسایی: در کروم، F12 را بزنید و به تب Console بروید. هر ورودی که با «Mixed Content» شروع می‌شود، یک منبع ناامن را نشان می‌دهد.
  2. جست‌وجوی سراسری: در دیتابیس، هر رشتهٔ http://example.com را با https://example.com جایگزین کنید — به‌شرطی که از ابزار سریالایز-آگاه استفاده کنید.
  3. بازبینی قالب و افزونه‌ها: بعضی قالب‌های قدیمی، آدرس‌ها را در فایل‌های CSS/JS به‌صورت هاردکد ذخیره می‌کنند. اگر پیدا کردید، جایگزین کنید — یا اگر در قالب والد است، در چایلد تم override کنید که آپدیت بعدی خرابش نکند.

پیشگیری از خطاهای SSL آینده

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

  1. یادآور تمدید در تقویم: اگر گواهی ۹۰ روزه است، در روز ۷۵ یک یادآور بگذارید. خودکارسازی خیلی وقت‌ها کار می‌کند، ولی آن یک باری که نمی‌کند، همین یادآور نجاتتان می‌دهد.
  2. پایش خارجی HTTPS: سرویس‌هایی مثل UptimeRobot یا Better Uptime می‌توانند علاوه بر آپ‌تایم، اعتبار SSL را هم پایش کنند و در روزهای آخر هشدار بدهند.
  3. پایش کاربردی با تست منظم: ماهی یک بار، SSL Labs را اجرا کنید. اگر امتیاز افت کرد، پیش از آنکه به مشکل تبدیل شود، آن را ببینید.

و یک تذکر امنیتی: گاهی برای «رفع سریع» مشکل، در برخی راهنماها پیشنهاد می‌شود که تأیید SSL را در وردپرس غیرفعال کنید — مثلاً با فیلتر https_ssl_verify. این کار دامنهٔ نفوذ MITM (Man-in-the-Middle) را باز می‌کند. هرگز روی سایت زنده این کار را نکنید، مگر موقتاً برای تشخیص؛ و بعد از تشخیص، فوراً حذف کنید. مسئلهٔ امنیت وردپرس یک لایهٔ یکپارچه است و همان چیزی که در راهنمای امنیت وردپرس برای مبتدیان درباره ترتیب لایه‌ها گفتم، اینجا هم صادق است: HTTPS یکی از ستون‌هاست، نه کل بنا.

اگر پس از همهٔ این مراحل باز هم خطای SSL دارید و هیچ‌کدام از پنج علت با آن جور درنمی‌آید، احتمالاً مشکل از پیکربندی سطح سرور است نه از وردپرس. برای مقایسه انواع گواهی و انتخاب درست، انواع گواهی SSL راهنمای خوبی است؛ و اگر خطا بعد از نصب گواهی جدید ظاهر شده، مرور اشتباهات رایج در نصب SSL احتمالاً یک نکته را روشن می‌کند. برای پرونده‌های فروشگاهی که هر ساعت بدون HTTPS، هزینه دارد، اهمیت SSL برای فروشگاه اینترنتی را از دست ندهید.

سخن پایانی

خطای SSL در وردپرس همیشه هم بحران نیست؛ ولی همیشه باید جدی گرفته شود. با شناخت پنج علت رایج و ابزارهای تشخیص دقیق، رفع مشکل معمولاً در کمتر از یک ساعت انجام می‌شود. مهم‌تر از رفع، پیشگیری است: تمدید خودکار را هر سه ماه یک بار تست کنید، Site URL و Home URL را راست‌آزمایی کنید، و اگر CDN دارید، حالت SSL را روی Full (Strict) نگه دارید. اگر خطای SSL ای داشته‌اید که راه‌حلش در این پنج علت جا نمی‌گرفت — مثلاً خطایی که فقط در یک مرورگر خاص یا یک اپراتور خاص رخ می‌داد — تجربه‌تان را در دیدگاه بنویسید؛ همان موارد نادر معمولاً به نکات طلاییِ همین راهنما اضافه می‌شوند. 🔒