خطای SSL یکی از رایجترین چالشهای امنیتی است که کاربران و مدیران وبسایتها با آن مواجه میشوند و میتواند دسترسی به یک وبسایت را بهطور کامل مسدود کند. این خطا زمانی رخ میدهد که مرورگر نمیتواند یک اتصال امن و رمزنگاریشده با سرور برقرار کند و اغلب با پیامهای گیجکنندهای مانند ERR_SSL_PROTOCOL_ERROR نمایش داده میشود. در این مقاله بهصورت کامل توضیح میدهیم که خطای SSL چیست و چرا بهوجود میآید. سپس، به شما آموزش میدهیم چگونه انواع این خطاها را هم در سمت سرور، و هم در سمت کاربر، شناسایی، عیبیابی و برای همیشه برطرف کنید.
خطای SSL چیست و چرا رخ میدهد؟
احتمالا شما هم هنگام وبگردی با پیامهایی مانندERR_SSL_PROTOCOL_VERSION_ALERT یا ERR_SSL_HANDSHAKE_FAILURE در مرورگر خود مواجه شدهاید؛ پیامی که میگوید اتصالتان امن نیست و از دسترسی شما به وبسایت جلوگیری میکند. این پیام، همان خطای SSL است و به زبان ساده، یعنی مرورگر شما (کلاینت) و سرور وبسایت نتوانستهاند یک کانال ارتباطی امن و رمزنگاریشده برقرار کنند.
بسیاری از مدیران وبسایتها تصور میکنند که پس از خرید SSL و نصب آن روی سرور، همه چیز بهصورت خودکار و بدون نیاز به کار خاصی امن باقی میماند. اما در حقیقت، گواهی SSL تنها بخشی از پازل است. برای برقراری یک اتصال امن، مرورگر و سرور باید طی یک فرایند مذاکره سریع به نام SSL/TLS Handshake بر سر جزئیاتی مانند نسخه پروتکل و الگوریتمهای رمزنگاری به توافق برسند.
بروز خطای SSL نشان میدهد که این مذاکره در یکی از مراحل خود، شکست خورده. دلایل این شکست میتواند بسیار متنوع باشد؛ از یک پیکربندی اشتباه در سرور گرفته تا مشکلات مربوط به خود گواهی (مانند منقضی شدن آن)، ناهماهنگی بین قابلیتهای مرورگر و سرور، یا حتی مشکلات سادهای مانند صحیح نبودن تاریخ و ساعت سیستم کاربر. به همین دلیل، انواع خطای SSL وجود دارد که هر یک بهدلیل خاصی رخ میدهند و شناخت آنها اولین قدم برای رفع انواع خطای SSL محسوب میشود.
انواع رایج خطاهای SSL
همانطور که گفتیم، خطای SSL یک پیام کلی است، اما این خطا انواع مختلفی دارد که هر کدام به یک مشکل خاص اشاره میکنند. شناخت این خطاها به شما کمک میکند تا سریعتر به ریشه مشکل پی ببرید و برای رفع انواع خطای SSL اقدام کنید. در ادامه، رایجترین ارورهای گواهی SSL را بررسی میکنیم.
۱. خطای ERR_SSL_PROTOCOL_VERSION_ALERT
این خطا زمانی رخ میدهد که مرورگر (کلاینت) و سرور نمیتوانند بر سر یک نسخه مشترک از پروتکل SSL/TLS به توافق برسند. مرورگرهای مدرن برای امنیت بیشتر، به استفاده از نسخههای جدیدتر مانند TLS 1.2 و TLS 1.3 اصرار دارند. اگر سرور وبسایت شما برای پشتیبانی از این نسخهها پیکربندی نشده باشد و فقط از نسخههای قدیمی و منسوخشده مانند SSLv3 یا TLS 1.0 استفاده کند، این خطا نمایش داده میشود.
دلایل اصلی بروز این خطا عبارتاند از:
- پیکربندی سرور برای استفاده از پروتکلهای قدیمی و ناامن
- تنظیمات امنیتی مرورگر کاربر که پشتیبانی از پروتکلهای قدیمی را غیرفعال کرده است.
- وجود یک فایروال یا پروکسی در میانه راه که در فرایند مذاکره اختلال ایجاد میکند.
۲. خطای ERR_SSL_HANDSHAKE_FAILURE
این یکی از عمومیترین انواع خطای SSL شناخته میشود و به این معناست که فرایند SSL/TLS Handshake با شکست مواجه شده. این فرایند شامل مراحل زیر است:
- Client Hello: کلاینت نسخههای SSL/TLS و الگوریتمهای رمزنگاری قابلپشتیبانی خود را اعلام میکند.
- Server Hello: سرور از میان موارد اعلامشده، نسخه پروتکل و الگوریتم رمزنگاری مورد نظر خود را انتخاب و اعلام میکند.
- Certificate Exchange: سرور گواهی SSL خود را برای تایید هویت ارسال میکند.
- Key Exchange: دو طرف کلیدهای رمزنگاری را برای آن سشن ایجاد و مبادله میکنند.
- Finished: پروسه Handshake کامل شده و ارتباط امن آغاز میشود.
شکست در هر یک از این مراحل میتواند بهدلایلی مانند سازگار نبودن الگوریتمهای رمزنگاری، مشکلات در Certificate Chain، تنظیمات نادرست سرور یا حتی اختلالات شبکه رخ دهد.
۳. خطای ERR_SSL_NO_CYPHER_OVERLAP
این خطا نسخه خاصتری از خطای Handshake Failure بهشمار میرود و مشخصا زمانی رخ میدهد که مرورگر و سرور هیچ الگوریتم رمزنگاری مشترکی برای رمزگذاری دادهها پیدا نکنند. به عبارت دیگر، لیست الگوریتمهای پشتیبانیشده توسط کلاینت و سرور هیچ نقطه اشتراکی ندارد. این اتفاق معمولا بهدلایل زیر رخ میدهد:
- سرور با مجموعهای بسیار محدود و سختگیرانه از Cipher Suiteها پیکربندی شده است.
- الگوریتمهای پشتیبانیشده توسط مرورگر کاربر، برای سرور بسیار جدید و ناشناخته هستند (معمولا در سرورهای قدیمی رخ میدهد).
- پیکربندی Cipher Suite سرور با نسخه پروتکل SSL/TLS آن همخوانی ندارد.
- سیاستهای امنیتی در هر یک از دو طرف (کلاینت یا سرور) بیش از حد محدودکننده است.
۴. خطای ERR_SSL_CERTIFICATE_INVALID
این خطا مستقیما به خود گواهی SSL اشاره دارد و زمانی رخ میدهد که مشکلی در اعتبار آن وجود داشته باشد. دلایل مشخصی که منجر به این خطا میشوند عبارتاند از:
- منقضی شدن گواهی: تاریخ اعتبار گواهی به پایان رسیده یا هنوز شروع نشده.
- تطابق نداشتن نام دامنه: نام عمومی یا نامهای جایگزین (SANs) در گواهی با آدرس دامنهای که به آن دسترسی دارید، مطابقت ندارد.
- زنجیره گواهی ناقص یا شکسته: گواهیهای میانی که برای تایید اعتبار گواهی اصلی لازم هستند، بهدرستی روی سرور نصب نشدهاند.
- مرجع صدور نامعتبر: گواهی توسط مرجعی صادر شده که توسط مرورگر معتبر شناخته نمیشود.
- گواهی باطلشده: گواهی بهدلایل امنیتی توسط مرجع صدور، باطل اعلام شده است.
- الگوریتم امضای ناامن: الگوریتم امضای استفادهشده در گواهی، ناامن تلقی میشود.
بررسی دقیقتر تطابق نداشتن نام دامنه
یکی از رایجترین دلایل خطای ERR_SSL_CERTIFICATE_INVALID، تطابق نداشتن نام دامنه است که به شکلهای مختلفی رخ میدهد:
- تطابق نداشتن نام دامنه اصلی: گواهی برای example.com صادر شده اما روی www.example.com یا یک زیردامنه دیگر استفاده میشود.
- تطابق نداشتن آدرس IP: گواهی برای یک نام دامنه صادر شده اما شما مستقیما از طریق آدرس IP به سرور متصل میشوید.
- مشکلات گواهی Wildcard: یک گواهی Wildcard (مانند *.example.com) ممکن است در صورت پیکربندی نادرست، تمام زیردامنهها را پوشش ندهد.
- مشکلات گواهی چنددامنهای: یک گواهی با چندین نام جایگزین ممکن است شامل تمام دامنههای مورد نیاز شما نباشد.
رفع مشکل تطابق نداشتن نام دامنه
- مطمئن شوید که نام عمومی گواهی با دامنه اصلی شما مطابقت دارد.
- تمام دامنهها و زیردامنههای مورد نیاز را به بخش نامهای جایگزین گواهی اضافه کنید.
- اگر نیاز به پوشش چندین زیردامنه دارید، از یک گواهی Wildcard استفاده کنید.
- بررسی کنید که گواهی روی سرور و دامنه صحیح نصب شده باشد.
دلایل اصلی خطای SSL و راهحلها
قبل از اینکه بهصورت عمیق وارد مباحث فنی شویم، جدول زیر یک نمای کلی از رایجترین دلایل بروز خطای SSL و راهحلهای سریع آنها ارائه میدهد. این جدول میتواند بهعنوان یک راهنمای عیبیابی سریع به شما کمک کند.
| علت خطا | توضیحات | راهحل |
| گواهی SSL نامعتبر | گواهی منقضیشده، دارای پیکربندی نادرست، یا از نوع Self-Signed است. | تمدید گواهیهای منقضیشده، پیکربندی صحیح زنجیره گواهی، یا دریافت یک گواهی معتبر از یک مرجع صدور قابلاعتماد. |
| تطابق نداشتن پروتکلهای SSL | سرور و مرورگر از نسخههای ناسازگار SSL/TLS پشتیبانی میکنند (مثلا سرور TLS 1.0 و مرورگر TLS 1.3). | بهروزرسانی پیکربندی سرور برای پشتیبانی از نسخههای مدرن TLS (مانند 1.2 و 1.3) و فعالسازی مذاکره پروتکل |
| مشکل در ساعت سیستم | صحیح نبودن تاریخ و زمان سیستم باعث شکست در اعتبارسنجی گواهی میشود. | همگامسازی زمان سیستم با سرورهای NTP (با استفاده از ntpdate) یا تنظیم همگامسازی خودکار زمان |
| مسدود شدن توسط آنتیویروس یا فایروال | ابزارهای امنیتی در ترافیک SSL اختلال ایجاد میکنند. | پیکربندی ابزارهای امنیتی برای مجاز شمردن ترافیک SSL/TLS، یا غیرفعالسازی موقت آنها برای تست |
| مشکل در کش یا کوکیهای مرورگر | دادههای خراب در کش مرورگر میتوانند سشنهای امن را مختل کنند. | پاک کردن کش و کوکیهای مرورگر، یا تست وبسایت در حالت Incognito/Private |
| قدیمی بودن سیستمعامل یا مرورگر | نسخههای قدیمی ممکن است از پروتکلهای مدرن SSL/TLS پشتیبانی نکنند. | بهروزرسانی سیستمعامل و مرورگر به آخرین نسخههای موجود |
| تداخل در DNS یا فایل Hosts | رکوردهای DNS نادرست یا ورودیهای سفارشی در فایل hosts باعث تطابق نداشتن گواهی میشوند. | بررسی رکوردهای DNS، پاک کردن کش DNS و بررسی فایل hosts برای ورودیهای متناقض |
| پیکربندی نادرست سرور | تنظیمات HTTPS نادرست یا وجود گواهیهای منقضیشده روی سرور | بازبینی و بهروزرسانی پیکربندی SSL سرور و اطمینان از نصب صحیح گواهی |
| مشکل در کش SSL | خراب بودن کش سشنهای SSL باعث شکست در فرایند Handshake میشود. | پاک کردن کش سشنهای SSL با استفاده از دستورات openssl یا ریستارت کردن سرویسهای SSL |
| کش DNS سرور | رکوردهای DNS قدیمی در سیستم، باعث بروز مشکل در اعتبارسنجی گواهی میشوند. | پاک کردن کش DNS سیستم با دستوراتی مانند systemd-resolve –flush-caches |
پیشنیازهای رفع انواع خطای SSL
قبل از اینکه وارد مراحل فنی و عیبیابی خطای SSL در سمت سرور شویم، حتما بررسی کنید که پیشنیازهای زیر را در اختیار دارید. این موارد برای اجرای دستورات و اعمال تغییرات روی سرور ضروری هستند:
- یک سرور لینوکسی: سروری که از توزیعهای لینوکس مانند اوبونتو (Ubuntu) یا موارد مشابه استفاده میکند.
- دسترسی روت یا Sudo: شما باید دسترسی مدیریتی root یا حداقل sudo برای اجرای دستورات با سطح دسترسی بالا را داشته باشید.
- آشنایی اولیه با خط فرمان: برای اجرای دستورات تشخیصی و ویرایش فایلهای پیکربندی، به دانش ابتدایی کار با ترمینال لینوکس نیاز دارید.
- یک نام دامنه متصل به سرور: برای تست کردن تنظیمات SSL، باید یک دامنه داشته باشید که به IP سرور شما اشاره کند.
- درک مفاهیم پایه SSL/TLS: آشنایی با مفاهیمی مانند گواهی SSL، فرایند Handshake و پروتکل HTTPS به شما در درک بهتر مراحل کمک خواهد کرد.
بخش اول: عیبیابی و رفع خطای SSL در سمت سرور
در این بخش، بهصورت تخصصی به سراغ سرور میرویم تا مشکلات را از ریشه حل کنیم. رفع انواع خطای SSL در سمت سرور نیازمند دسترسی به خط فرمان و اجرای دستورات تشخیصی است. این راهنما به شما کمک میکند تا بهصورت سیستماتیک مشکلات را شناسایی و برطرف کنید.
قدم ۱: نصب ابزارهای عیب یابی ضروری
قبل از هر اقدامی، باید ابزارهای لازم برای عیبیابی را روی سرور خود نصب کنیم. این ابزارها به ما کمک میکنند تا تنظیمات SSL را تحلیل کرده و مشکلات خاص را شناسایی کنیم.
ابتدا، لیست پکیجهای سرور خود را بهروزرسانی کنید. این دستور لیست بستههای نرمافزاری موجود در مخازن را با سرور شما همگام میکند:
sudo apt update
سپس، ابزار OpenSSL را برای تست گواهی و اتصالات نصب کنید. OpenSSL ابزار اصلی ما برای تحلیل دقیق فرایند SSL/TLS خواهد بود:
sudo apt install openssl
دستور openssl قابلیتهای جامعی برای تست SSL/TLS فراهم میکند، از جمله اعتبارسنجی گواهی، تست پروتکلها و تحلیل الگوریتمهای رمزنگاری.
در ادامه، ابزار curl را برای تستهای مبتنی بر HTTP/HTTPS نصب کنید:
sudo apt install curl
curl به شما اجازه میدهد تا درخواستهای HTTP/HTTPS را با جزئیات دقیق مربوط به SSL ارسال کنید که برای عیبیابی مشکلات اتصال بسیار ضروری است.
در نهایت، ابزار nmap را برای اسکن پورتها و سرویسهای SSL نصب کنید:
sudo apt install nmap
nmap میتواند پورتهای باز را اسکن کرده و سرویسهای SSL را تست کند. این ابزار به شما کمک میکند مشکلات پیکربندی را در سطح شبکه شناسایی کنید.
با نصب این سه ابزار، شما برای شروع فرایند عیبیابی انواع خطای SSL کاملا مجهز هستید.
قدم ۲: نحوه تشخیص خطاهای پروتکل SSL در سمت سرور
حالا که ابزارهای لازم را در اختیار داریم، میتوانیم بهصورت سیستماتیک به تشخیص انواع خطای SSL بپردازیم.
تست اتصال SSL با OpenSSL
اولین و مهمترین قدم، استفاده از ابزار OpenSSL برای شبیهسازی اتصال SSL به سرور شما است. این دستور جزئیات کاملی از فرایند Handshake را به ما نشان میدهد.
دستور زیر را در ترمینال سرور خود اجرا کنید و your-domain.com را با نام دامنه واقعی خود جایگزین کنید:
openssl s_client -connect your-domain.com:443 -servername your-domain.com
نکته مهم: استفاده از فلگ -servername ضروری است. این فلگ قابلیت SNI را فعال میکند که به سرور میگوید شما قصد اتصال به کدام وبسایت را دارید. این قابلیت برای سرورهایی که میزبان چندین گواهی SSL برای دامنههای مختلف هستند، حیاتی است.
پس از اجرای دستور، بهدنبال این شاخصهای کلیدی در خروجی بگردید:
- نسخه پروتکل: باید TLS 1.2 یا TLS 1.3 باشد.
- مجموعه رمزنگاری: الگوریتم رمزنگاری مورد استفاده را نشان میدهد.
- زنجیره گواهی: اعتبار گواهی را تایید میکند.
- وضعیت Handshake: موفقیتآمیز بودن یا نبودن اتصال را مشخص میکند.
مثال از یک اتصال SSL موفق
خروجی یک اتصال موفق چیزی شبیه به این خواهد بود:
CONNECTED(00000003) depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1 verify return:1 depth=1 C = US, O = Let's Encrypt, CN = R3 verify return:1 depth=0 CN = your-domain.com verify return:1 --- Certificate chain 0 s:/CN=your-domain.com i:/C=US/O=Let's Encrypt/CN=R3 1 s:/C=US/O=Let's Encrypt/CN=R3 i:/C=US/O=Internet Security Research Group/CN=ISRG Root X1 --- Server certificate -----BEGIN CERTIFICATE----- ... (Certificate details) -----END CERTIFICATE----- subject=/CN=your-domain.com issuer=/C=US/O=Let's Encrypt/CN=R3 --- No client certificate CA names sent Peer signing digest: SHA256 Peer signature type: RSA Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 3053 bytes and written 456 bytes Verification: OK --- New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN, server accepted to use h2 ---
عبارت Verification: OK نشان میدهد که همه چیز به درستی انجام شده.
مثال از یک اتصال SSL ناموفق
اگر با مشکلی مواجه باشید، خروجی چیزی شبیه به این خواهد بود:
CONNECTED(00000003) depth=0 CN = your-domain.com verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 CN = your-domain.com verify error:num=21:unable to verify the first certificate verify return:1 --- Certificate chain 0 s:/CN=your-domain.com i:/C=US/O=Let's Encrypt/CN=R3 --- Server certificate -----BEGIN CERTIFICATE----- ... (Certificate details) -----END CERTIFICATE----- subject=/CN=your-domain.com issuer=/C=US/O=Let's Encrypt/CN=R3 --- No client certificate CA names sent Peer signing digest: SHA256 Peer signature type: RSA Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 3053 bytes and written 456 bytes Verification error: unable to verify the first certificate --- New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN, server accepted to use h2 ---
توضیح و راهحل
این خروجی بهوضوح یک خطای SSL را نشان میدهد. دو خطای اصلی عبارتاند از:
- verify error:num=20:unable to get local issuer certificate: این خطا یعنی کلاینت (در اینجا openssl) نتوانسته گواهی صادرکننده را در میان مراجع معتبر خود پیدا کند. دلیل اصلی این مشکل، نصب نبودن گواهی میانی روی سرور شما است.
- verify error:num=21:unable to verify the first certificate: این خطا پیامد خطای قبلی است. چون گواهی میانی در دسترس نیست، کلاینت نمیتواند اعتبار گواهی اصلی دامنه شما را تایید کند.
برای رفع این مشکل، باید مطمئن شوید که گواهی میانی بهدرستی روی سرور شما نصب و پیکربندی شده. این فرایند معمولا شامل مراحل زیر میشود:
- دریافت گواهی میانی: باید از مرجع صدور گواهی که SSL را از آن تهیه کردهاید یا از یک منبع معتبر دیگر این گواهی را دریافت کنید.
- نصب گواهی میانی روی سرور: این گواهی را باید روی سرور خود، معمولا در یک دایرکتوری مشخص یا درون یک فایل پیکربندی، نصب کنید.
- پیکربندی سرور برای استفاده از گواهی میانی: وبسرور خود (آپاچی یا Nginx) را طوری پیکربندی کنید که از این گواهی میانی در فرایند SSL/TLS Handshake استفاده کند. این کار ممکن است نیازمند بهروزرسانی فایلهای تنظیمات SSL/TLS سرور شما باشد.
پس از رفع این موارد، تست اتصال SSL را مجددا اجرا کنید تا مطمئن شوید زنجیره گواهی بهدرستی پیکربندی شده و اتصال SSL با موفقیت برقرار میشود.
بررسی نسخههای SSL/TLS پشتیبانیشده
برای اینکه ببینید سرور شما از کدام نسخههای پروتکل پشتیبانی میکند، میتوانید دستور openssl را با فلگهای مختلف اجرا کنید.
برای تست پشتیبانی از TSL 1.2:
openssl s_client -connect your-domain.com:443 -tls1_2 -servername your-domain.com
خروجی:
CONNECTED(00000003) depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1 verify return:1 depth=1 C = US, O = Let's Encrypt, CN = R3 verify return:1 depth=0 CN = your-domain.com verify return:1 --- Certificate chain 0 s:/CN=your-domain.com i:/C=US/O=Let's Encrypt/CN=R3 --- Server certificate -----BEGIN CERTIFICATE----- ... (Certificate details) -----END CERTIFICATE----- subject=/CN=your-domain.com issuer=/C=US/O=Let's Encrypt/CN=R3 --- No client certificate CA names sent Peer signing digest: SHA256 Peer signature type: RSA Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 3053 bytes and written 456 bytes --- New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN, server accepted to use h2 ---
برای تست پشتیبانی از TLS 1.3:
openssl s_client -connect your-domain.com:443 -tls1_3 -servername your-domain.com
خروجی:
CONNECTED(00000003) depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1 verify return:1 depth=1 C = US, O = Let's Encrypt, CN = R3 verify return:1 depth=0 CN = your-domain.com verify return:1 --- Certificate chain 0 s:/CN=your-domain.com i:/C=US/O=Let's Encrypt/CN=R3 --- Server certificate -----BEGIN CERTIFICATE----- ... (Certificate details) -----END CERTIFICATE----- subject=/CN=your-domain.com issuer=/C=US/O=Let's Encrypt/CN=R3 --- No client certificate CA names sent Peer signing digest: SHA256 Peer signature type: RSA Server Temp Key: ECDH, P-256, 256 bits --- SSL handshake has read 3053 bytes and written 456 bytes --- New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN, server accepted to use h2 ---
اگر سرور از این نسخهها پشتیبانی کند، خروجی موفقیتآمیزی مشابه قبل خواهید دید. اما اگر بخواهید یک نسخه قدیمی مانند TLS 1.1 را تست کنید و سرور آن را پشتیبانی نکند:
openssl s_client -connect your-domain.com:443 -tls1_1 -servername your-domain.com
خروجی:
140255555555:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1492:SSL alert number 40 --- no peer certificate available --- No client certificate CA names sent --- SSL handshake has read 7 bytes and written 305 bytes --- New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN, server accepted to use h2 ---
خطای sslv3 alert handshake failure بهوضوح نشان میدهد که سرور این نسخه از پروتکل را رد کرده است. برای رفع این مشکل، باید پیکربندی وبسرور خود را بهروز کنید تا از نسخههای جدیدتر پشتیبانی کند.
تحلیل مشکلات گواهی
برای بررسی جزئیات خود گواهی، مانند تاریخ انقضا، از دستور زیر استفاده کنید:
openssl s_client -connect your-domain.com:443 -servername your-domain.com | openssl x509 -noout -dates
خروجی نمونه به این شکل خواهد بود:
notBefore=May 1 00:00:00 2023 GMT notAfter=Oct 29 23:59:59 2023 GMT
این دستور دوره اعتبار گواهی را نمایش میدهد. خروجی شامل دو بخش خواهد بود:
- notBefore: تاریخی که اعتبار گواهی آغاز میشود.
- notAfter: تاریخی که گواهی منقضی میشود.
برای بررسی اطلاعات مربوط به نام دامنه و مرجع صدور، دستور زیر را اجرا کنید:
openssl s_client -connect your-domain.com:443 -servername your-domain.com | openssl x509 -noout -subject -issuer
خروجی نمونه به این شکل خواهد بود:
subject=/CN=your-domain.com issuer=/C=US/O=Let's Encrypt/CN=R3
این کار به شما در شناسایی مشکلات تطابق نداشتن نام دامنه و مسائل مربوط به مرجع صدور گواهی کمک میکند.
قدم ۳: چگونه خطاهای مربوط به نسخه پروتکل SSL را در سمت سرور حل کنیم؟
اگر در مراحل عیبیابی با خطاهای مربوط به نسخه پروتکل SSL مواجه شدید، لازم است پیکربندی سرور خود را بهروز کنید تا از نسخههای مدرن و امن TLS پشتیبانی کرده و همزمان نسخههای منسوخ و آسیبپذیر را غیرفعال نمایید. این یکی از کلیدیترین اقدامات برای رفع انواع خطای SSL است.
پیکربندی در وبسرور آپاچی
ابتدا فایل پیکربندی SSL سایت خود را با یک ویرایشگر متن مانند nano باز کنید:
sudo nano /etc/apache2/sites-available/your-site-ssl.conf
سپس، درون بلوک <VirtualHost>، دستور SSLProtocol را اضافه کرده یا آن را به شکل زیر تغییر دهید:
<VirtualHost *:443>
ServerName your-domain.com
DocumentRoot /var/www/your-site
# تنظیمات SSL
SSLEngine on
SSLCertificateFile /path/to/your/certificate.crt
SSLCertificateKeyFile /path/to/your/private.key
SSLCertificateChainFile /path/to/your/ca-bundle.crt
# غیرفعال کردن نسخههای منسوخ SSL و فعالسازی TLS 1.2+
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2 +TLSv1.3
# پیکربندی Cipher Suiteهای امن
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
# فعالسازی HSTS (HTTP Strict Transport Security)
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
</VirtualHost>
دستور SSLProtocol به صراحت نسخههای آسیبپذیر SSL/TLS (شامل SSLv2, SSLv3, TLSv1, TLSv1.1) را غیرفعال کرده و نسخههای امن (مثل TLS 1.2 و 1.3) را فعال میکند.
پس از ذخیره فایل، پیکربندی آپاچی را تست کنید:
sudo apache2ctl configtest
خروجی مورد انتظار:
Syntax OK
اگر پیکربندی معتبر بود و پیام Syntax OK را مشاهده کردید، آپاچی را ریلود کنید تا تغییرات جدید اعمال شوند:
sudo systemctl reload apache2
پیکربندی در وبسرور Nginx
فایل پیکربندی SSL سایت خود در Nginx را ویرایش کنید:
sudo nano /etc/nginx/sites-available/your-site
درون بلوک server، دستورات مربوط به SSL را به شکل زیر اضافه یا ویرایش کنید:
server {
listen 443 ssl http2;
server_name your-domain.com;
root /var/www/your-site;
# تنظیمات SSL
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
# غیرفعال کردن نسخههای منسوخ SSL و فعالسازی TLS 1.2+
ssl_protocols TLSv1.2 TLSv1.3;
# پیکربندی Cipher Suiteهای امن
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# فعالسازی HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# بهینهسازی سشنهای SSL
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
}
دستور ssl_protocols مشخص میکند که کدام نسخههای TLS باید پشتیبانی شوند، در حالی که ssl_ciphers الگوریتمهای رمزنگاری مجاز را تعریف میکند.
پیکربندی Nginx را تست کنید تا مطمئن شوید که معتبر و بدون خطا است:
sudo nginx -t
خروجی باید نشان دهد که پیکربندی معتبر است یا خیر. نمونهای از یک خروجی موفق باید به این شکل باشد:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
اگر پیکربندی معتبر بود، Nginx را ریلود کنید تا تغییرات اعمال شوند:
sudo systemctl reload nginx
این دستور Nginx را بدون قطع کردن سرویسدهی، مجددا بارگذاری میکند و اطمینان میدهد که هرگونه تغییر در پیکربندی، بدون ایجاد وقفه اعمال میشود.
قدم ۴: چگونه خطاهای مربوط به گواهی SSL را در سمت سرور حل کنیم؟
خطاهای مربوط به گواهی SSL یکی از شایعترین دلایل شکست پروتکل SSL هستند. در این بخش، به شما نشان میدهیم چگونه این نوع خطاها را تشخیص داده و برطرف کنید.
بررسی اعتبار گواهی
اولین قدم این است که مطمئن شوید گواهی شما منقضی نشده. برای این کار از دستور زیر استفاده کنید:
openssl x509 -in /path/to/your/certificate.crt -text -noout | grep -A 2 "Validity"
توجه: /path/to/your/certificate.crt را با مسیر واقعی فایل گواهی خود روی سرور جایگزین کنید.
این دستور دوره اعتبار گواهی را به شما نشان میدهد. اگر تاریخ انقضای گواهی گذشته باشد، باید آن را تمدید کنید.
تایید زنجیره گواهی
برای بررسی کامل زنجیره گواهی، از دستور زیر استفاده کنید:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts
این دستور تمام گواهیهای موجود در زنجیره، از جمله گواهی اصلی، گواهیهای میانی و گواهی root را نمایش میدهد. مطمئن شوید که زنجیره کامل است و هیچ گواهی میانیای از قلم نیفتاده باشد.
رفع تطابق نداشتن نام دامنه
اگر با خطاهای تطابق نداشتن نام دامنه یا Hostname Mismatch مواجه هستید، باید نامهای جایگزین گواهی خود را بررسی کنید:
openssl x509 -in /path/to/your/certificate.crt -text -noout | grep -A 1 "Subject Alternative Name"
خروجی این دستور باید شامل نام دامنه شما باشد. اگر نام دامنه شما در لیست SANها وجود ندارد، باید یک گواهی جدید دریافت کنید که شامل نام دامنه صحیح باشد.
تمدید گواهی با Let’s Encrypt
اگر از گواهیهای رایگان Let’s Encrypt استفاده میکنید، میتوانید آنها را بهراحتی با ابزار Certbot تمدید کنید. ابتدا، فرایند تمدید را با استفاده از فلگ –dry-run تست کنید تا از صحت عملکرد آن مطمئن شوید:
sudo certbot renew --dry-run
فلگ –dry-run فرایند تمدید را شبیهسازی میکند، اما در عمل گواهی را تمدید نمیکند. اگر این دستور بدون خطا اجرا شد، میتوانید با حذف این فلگ، تمدید واقعی را انجام دهید:
sudo certbot renew
پس از تمدید موفقیتآمیز، وبسرور خود را ریستارت کنید تا گواهی جدید بارگذاری شود:
برای آپاچی:
sudo systemctl restart apache2
برای Nginx:
sudo systemctl restart nginx
قدم ۵: چگونه مشکلات مربوط به Cipher Suite را در سمت سرور حل کنیم؟
تطابق نداشتن در مجموعههای رمزنگاری میتواند باعث شکست در فرایند SSL Handshake و در نتیجه، بروز خطای SSL شود. در این بخش، یاد میگیریم که چگونه Cipher Suiteهای امن را پیکربندی کنیم.
تست Cipher Suiteهای فعلی
ابتدا باید بررسی کنیم که سرور شما در حال حاضر از چه مجموعههای رمزنگاری پشتیبانی میکند. برای این کار از ابزار nmap استفاده میکنیم:
nmap --script ssl-enum-ciphers -p 443 your-domain.com
خروجی این دستور چیزی شبیه به این خواهد بود:
Starting Nmap 7.92 ( https://nmap.org ) Nmap scan report for your-domain.com (192.168.1.1) Host is up (0.00044s latency). PORT STATE SERVICE 443/tcp open https | ssl-enum-ciphers: | TLSv1.2: | ciphers: | TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A | TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 2048) - A | TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A | TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (dh 2048) - A | compressors: | NULL | cipher preference: server |_ least strength: A
این خروجی تمام Cipher Suiteهای پشتیبانیشده توسط سرور شما را به همراه رتبه امنیتی آنها لیست میکند.
پیکربندی Cipher Suiteهای امن
حالا باید وبسرور خود را طوری پیکربندی کنیم که فقط از الگوریتمهای قوی و مدرن استفاده کند.
برای وبسرور آپاچی
این دستور را به فایل پیکربندی SSL خود اضافه کنید (یا دستور SSLCipherSuite موجود را با آن جایگزین کنید):
# پیکربندی مجموعه رمزنگاری مدرن SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 # غیرفعالسازی سایفرهای ضعیف SSLCipherSuite !aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!SRP:!CAMELLIA
برای وبسرور Nginx
از دستور زیر در فایل پیکربندی Nginx خود استفاده کنید:
# پیکربندی مجموعه رمزنگاری مدرن ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
این پیکربندیها، مجموعههای رمزنگاری مدرن و امن را در اولویت قرار میدهند و همزمان سازگاری با اکثر کلاینتها را حفظ میکنند. پس از اعمال این تغییرات، حتما سرویس وبسرور خود را ریلود کنید.
قدم ۶: تست، تایید و نگهداری
پس از پیادهسازی راهحلها، باید بهطور کامل پیکربندی SSL خود را تست کنید تا از صحت عملکرد آن و رفع انواع خطای SSL مطمئن شوید.
تست و تایید نهایی
تایید پیکربندی SSL/TLS
بار دیگر اتصال SSL را با openssl تست کنید:
openssl s_client -connect your-domain.com:443 -servername your-domain.com
بهدنبال پیامهای موفقیتآمیز Handshake بگردید و مطمئن شوید که نسخه پروتکل TLS 1.2 یا بالاتر است.
تست با مرورگرهای مختلف
وبسایت خود را با مرورگرهای مختلف مثل کروم، فایرفاکس، سافاری و اج تست کنید تا از سازگاری آن مطمئن شوید. هر مرورگر ممکن است الزامات SSL/TLS متفاوتی داشته باشد، بنابراین تست کردن وبسایت در مرورگرهای مختلف، سازگاری کامل آن را تضمین میکند.
استفاده از ابزارهای آنلاین تست SSL
از تست سرور SSL Labs برای دریافت یک تحلیل جامع استفاده کنید. میتوانید این کار را از طریق خط فرمان با دستور زیر انجام دهید:
curl -s "https://api.ssllabs.com/api/v3/analyze?host=your-domain.com&publish=off&all=done" | jq .
نکته: برای اجرای این دستور، ممکن است به ابزار jq برای فرمتبندی خروجی JSON نیاز داشته باشید. این دستور اطلاعات دقیقی درباره پیکربندی SSL شما ارائه میدهد و مشکلات امنیتی بالقوه را شناسایی میکند. (راه سادهتر، مراجعه به وبسایت ssllabs.com/ssltest است).
تایید زنجیره گواهی
اطمینان حاصل کنید که زنجیره گواهی شما کامل است:
openssl s_client -connect your-domain.com:443 -servername your-domain.com | openssl x509 -noout -text | grep -A 5 "Issuer"
خروجی باید مرجع صدوری که گواهی شما را صادر کرده است، نشان دهد.
مانیتورینگ و نگهداری
برای جلوگیری از بروز مجدد خطای SSL در آینده، یک سیستم نظارت و نگهداری مداوم پیادهسازی کنید.
راهاندازی سیستم نظارت بر انقضای گواهی
یک اسکریپت برای بررسی تاریخ انقضای گواهی ایجاد کنید:
#!/bin/bash # اسکریپت بررسی تاریخ انقضای گواهی DOMAIN="your-domain.com" DAYS_BEFORE_EXPIRY=30 # دریافت تاریخ انقضای گواهی EXPIRY_DATE=$(openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2) # تبدیل تاریخ به ثانیه EXPIRY_SECONDS=$(date -d "$EXPIRY_DATE" +%s) CURRENT_SECONDS=$(date +%s) # محاسبه روزهای باقیمانده تا انقضا DAYS_UNTIL_EXPIRY=$(( (EXPIRY_SECONDS - CURRENT_SECONDS) / 86400 )) if [ $DAYS_UNTIL_EXPIRY -le $DAYS_BEFORE_EXPIRY ]; then echo "Certificate for $DOMAIN expires in $DAYS_UNTIL_EXPIRY days!" # Add notification logic here (email, Slack, etc.) fi
این اسکریپت را با نام check-ssl-expiry.sh در مسیر /usr/local/bin/ ذخیره کرده و آن را اجرایی کنید:
sudo chmod +x /usr/local/bin/check-ssl-expiry.sh
زمانبندی بررسیهای منظم SSL
یک Cron Job اضافه کنید تا اسکریپت بررسی گواهی بهصورت روزانه اجرا شود. برای این کار، ویرایشگر کرونتب را باز کنید:
sudo crontab -e
و خط زیر را به آن اضافه کنید تا اسکریپت هر روز ساعت ۹ صبح اجرا شود:
0 9 * * * /usr/local/bin/check-ssl-expiry.sh
فعالسازی لاگهای SSL وبسرور
برای آپاچی، لاگگیری SSL را در فایل پیکربندی Virtual Host خود فعال کنید:
LogLevel warn ssl:info
CustomLog /var/log/apache2/ssl_request.log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
برای Nginx، لاگهای مخصوص SSL را اضافه کنید:
access_log /var/log/nginx/ssl_access.log combined; error_log /var/log/nginx/ssl_error.log warn;
این لاگها به شما کمک میکنند تا مشکلات مربوط به SSL را شناسایی کرده و بر الگوهای اتصال نظارت کنید.
بخش دوم: چگونه خطای SSL را در سمت کاربر حل کنیم؟
گاهی اوقات، مشکل از سمت سرور نیست و خطای SSL بهدلیل تنظیمات نادرست یا مشکلات موقت در سمت کاربر (مرورگر یا سیستمعامل) رخ میدهد. اگر کاربر وبسایت هستید و با این خطا مواجه شدهاید، راهحلهای زیر را امتحان کنید.
آدرس وبسایت را بررسی کنید
مطمئن شوید که آدرس وبسایت با https شروع میشود و نه http. یک اشتباه تایپی ساده یا یک پیکربندی نادرست میتواند شما را در معرض شنود، دستکاری سیستم و حملات man-in-the-middle قرار دهد و باعث بروز خطای SSL شود. همیشه آدرس را در نوار مرورگر خود بررسی کنید.
کش و کوکیهای مرورگر را پاک کنید
کش و کوکیهای مرورگر گاهی اوقات خراب میشوند و در فرایند SSL Handshake اختلال ایجاد میکنند. پاک کردن این موارد میتواند مشکلات مربوط به خطاهای پروتکل SSL را برطرف کند. در اینجا مراحل پاک کردن کش و کوکیها در مرورگرهای محبوب آمده است:
- در گوگل کروم: به مسیر Settings > Privacy and Security > Clear browsing data بروید.
- در موزیلا فایرفاکس: به مسیر Options > Privacy & Security > Cookies and Site Data > Clear Data بروید.
- در سافاری: از منوی Safari گزینه Clear History را انتخاب کنید.
- در مایکروسافت اج: به مسیر Settings > Privacy, search, and services > Clear browsing data بروید.
این کار تاریخچه مرور، کوکیها و سایر دادههای سایت که ممکن است در اتصالات SSL اختلال ایجاد کنند را حذف میکند.
SSL State را پاک کنید
در سیستمعامل ویندوز، میتوانید کش SSL را پاک کنید تا مشکلات مربوط به سشنهای قدیمی برطرف شود. برای انجام این کار مراحل زیر را طی کنید:
- کلیدهای Windows + R را فشار دهید تا پنجره Run باز شود.
- عبارت inetcpl.cpl را تایپ کرده و Enter را بزنید.
- در پنجره Internet Properties، به تب Content بروید.
- روی دکمه Clear SSL state کلیک کنید.
این کار SSL State را پاک و مشکلات مربوط به خطاهای پروتکل SSL را برطرف میکند.
ساعت و تاریخ سیستم خود را بررسی کنید
صحیح نبودن ساعت و تاریخ سیستم یکی از دلایل رایج شکست در اعتبارسنجی گواهی SSL بهشمار میرود. گواهیهای SSL بر اساس تاریخ و زمان فعلی اعتبارسنجی میشوند. اگر ساعت سیستم شما دقیق نباشد، مرورگر ممکن است فکر کند که گواهی منقضی شده یا هنوز معتبر نشده.
مرورگر خود را بهروزرسانی کنید
استفاده از مرورگر قدیمی میتواند بهدلیل پشتیبانی نکردن از پروتکلهای مدرن SSL/TLS، باعث بروز خطا شود. همیشه از آخرین نسخه مرورگر خود استفاده کنید.
آنتیویروس یا فایروال را موقتا غیرفعال کنید
نرمافزارهای امنیتی مانند VPN، آنتیویروس یا فایروال گاهی اوقات در ارتباطات SSL/TLS دخالت کرده و باعث بروز خطا میشوند. این ابزارها را بهطور موقت غیرفعال کنید و ببینید آیا مشکل برطرف میشود یا خیر. اگر مشکل حل شد، باید تنظیمات آن نرمافزار را طوری تغییر دهید که به ترافیک SSL وبسایت مورد نظر اجازه عبور دهد.
اتصال اینترنت یا تنظیمات شبکه را بررسی کنید
مشکلات اتصال به اینترنت یا پیکربندی نادرست شبکه نیز میتواند منجر به خطای SSL شود. سعی کنید به یک شبکه دیگر متصل شوید یا تنظیمات روتر و DNS خود را ریست کنید.
از یک مرورگر دیگر استفاده کنید
اگر خطا فقط در یک مرورگر خاص رخ میدهد، احتمالا مشکل مربوط به همان مرورگر (کش، افزونهها یا تنظیمات خاص آن) است. وبسایت را با یک مرورگر دیگر باز کنید تا مطمئن شوید مشکل از کجاست.
جمعبندی
خطای SSL، اگرچه در نگاه اول پیچیده به نظر میرسد، اما با یک رویکرد سیستماتیک قابل شناسایی و حل است. این خطاها میتوانند ناشی از پیکربندیهای نادرست سمت سرور مانند نسخههای پروتکل قدیمی، گواهیهای نامعتبر و الگوریتمهای رمزنگاری ناسازگار، یا مشکلات ساده سمت کاربر مانند نادرست بودن ساعت سیستم باشند.
با استفاده از ابزارهای تشخیصی مناسب و دنبال کردن مراحل ذکر شده برای رفع انواع خطای SSL، مدیران وبسایتها میتوانند بهسرعت ریشه مشکل را پیدا کرده و با رفع انواع خطای SSL، یک اتصال امن، پایدار و قابلاعتماد را برای کاربران خود تضمین کنند.





