تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

راهنمای رفع خطاهای پروتکل SSL: بررسی دلایل و ارائه راه‌حل‌ها


۳۱ شهریور ۱۴۰۴

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

یکی از رایج‌ترین نمونه‌ها، خطای ERR_SSL_PROTOCOL_ERROR است که اغلب در مرورگرهایی مانند Chrome و Firefox مشاهده می‌شود. این خطا مانع از اتصال امن کاربران به وب‌سایت می‌شود و معمولاً با پیام‌هایی مبهم یا گیج‌کننده همراه است.

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

در ادامه خواهید خواند:

  • پیش‌ نیاز
  • درک خطاهای رایج پروتکل SSL
  • نصب ابزارهای عیب‌یابی
  • چگونه خطاهای پروتکل SSL را در سمت سرور تشخیص دهیم؟
  • چگونه خطاهای نسخه پروتکل SSL را در سمت سرور برطرف کنیم؟
  • چگونه خطاهای مربوط به گواهی را در سمت سرور برطرف کنیم؟
  • چگونه مشکلات مجموعه رمزها (Cipher Suite) را در سمت سرور برطرف کنیم؟
  • آزمایش و تایید
  • مانیتورینگ و نگهداری
  • چگونه خطای پروتکل SSL را در سمت کاربر مرورگر برطرف کنیم؟
  • سوالات متداول
  • جمع بندی

پیش‌ نیاز

قبل از شروع این راهنما، به موارد زیر نیاز خواهید داشت:

  • یک سرور با سیستم‌عامل اوبونتو یا هر توزیع دیگر لینوکس.
  • دسترسی Root یا مجوزهای sudo روی سرور.
  • آشنایی پایه با خط فرمان (Command Line).
  • یک دامنه که به سرور شما اشاره دارد (برای تست تنظیمات SSL).
  • درک اولیه‌ای از مفاهیم SSL/TLS.

درک خطاهای رایج پروتکل SSL

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

ERR_SSL_PROTOCOL_VERSION_ALERT

این خطا زمانی رخ می‌دهد که مروگر و سرور نتوانند روی یک نسخه مشترک پروتکل SSL/TLS به توافق برسند. مرورگرهای مدرن نیاز به TLS 1.2 یا بالاتر دارند، درحالی که سرورهای قدیمی ممکن است فقط نسخه‌های منسوخ شده را پشتیبانی کنند این مشکل زمانی رایج است که:

  • سرور برای استفاده از پروتکل‌های قدیمی و ناامن مانند SSL 3.0 یا TLS 1.0 تنظیم شده باشد.
  • مرورگر به دلایل امنیتی از پشتیبانی پروتکل‌های قدیمی غیرفعال شده باشد.
  • یک پروکسی یا فایروال در مسیر وجود داشته باشد که بر توافق پروتکل تاثیر بگذارد.

ERR_SSL_HANDSHAKE_FAILURE

این خطا زمانی رخ می‌دهد که فرآیند دست‌دهی SSL/TLS برای ایجاد اتصال امن بین مرورگر و سرور شکست بخورد. فرآیند دست‌دهی شامل چند مرحله است.

  • Client Hello: مرورگر اتصال را با ارسال نسخه‌ها و Cipher Suiteهای پشتیبانی‌شده آغاز می‌کند
  • Server Hello: سرور با نسخه پروتکل و Cipher Suite انتخابی خود پاسخ می‌دهد
  • Certificate Exchange: سرور گواهی SSL خود را برای اعتبارسنجی ارسال می‌کند
  • Key Exchange: هر دو طرف کلیدهای رمزگذاری برای جلسه را برقرار می‌کنند
  • Finished: دست‌دهی کامل شده و ارتباط امن آغاز می‌شود

دلایل رایج شکست Handshake شامل موارد زیر است:

  • عدم سازگاری Cipher Suite بین مرورگر و سرور
  • شکست در اعتبارسنجی زنجیره گواهی
  • مشکلات احراز هویت مرورگر
  • اختلالات شبکه در طول Handshake
  • مشکلات پیکربندی سرور با تنظیمات SSL/TLS
  • ناسازگاری نسخه پروتکل
  • گواهی‌های نامعتبر یا منقضی شده
  • تداخل نرم‌افزارهای امنیتی روی مرورگر

ERR_SSL_NO_CYPHER_OVERLAP

این خطا زمانی رخ می‌دهد که مرورگر و سرور هیچ Cipher Suite مشترکی برای رمزگذاری نداشته باشند. معمولا زمانی رخ می‌دهد که:

  • سرور با مجموعه بسیار محدودی از Cipher Suite ها تنظیم شده باشد.
  • Cipher Suite های پشتیبانی شده توسط مرورگر برای سرور خیلی جدید باشد.
  • پیکربندی Cipher سرور با نسخه پروتکل SSL/TLS هم‌خوانی نداشته باشد.
  • سیاست‌های امنیتی در هر دو سمت بسیار محدود کننده باشند.

ERR_SSL_CERTIFICATE_INVALID

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

  • گواهی منقضی شده یا هنوز معتبر نشده باشد.
  • Common Name (CN) یا Subject Alternative Names (SANs) با دامنه مطابقت نداشته باشند.
  • زنجیره گواهی ناقص یا خراب باشد.
  • گواهی توسط یک مرجع صدور گواهی غیر قابل اعتماد صادر شده باشد.
  • گواهی لغو شده باشد.
  • الگوریتم امضای گواهی ناامن باشد.
با سرور Ubuntu لیارا، زیرساخت پروژه‌های خودت رو سریع و امن راه‌اندازی کن.
✅ نصب آسان و آماده استفاده ✅ منابع اختصاصی و پایدار ✅ دسترسی کامل SSH
خرید و راه‌اندازی سرور Ubuntu

ناهماهنگی گواهی‌ها

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

  • Mismatch نام دامنه: گواهی برای example.com صادر شده اما روی www.example.com یا یک زیر دامنه استفاده می‌شود
  • Mismatch آدرس IP: گواهی برای یک نام دامنه صادر شده اما روی آدرس IP استفاده می‌شود
  • مشکلات Wildcard: گواهی Wildcard (*.example.com) ممکن است همه زیر دامنه‌ها را پوشش ندهد اگر درست تنظیم نشده باشد
  • مشکلات Multi-Domain: گواهی با چند SAN ممکن است همه دامنه‌های لازم را شامل نشود

راهکار رفع ناهماهنگی گواهی‌ها:

  • مطمئن شوید CN گواهی با دامنه اصلی شما مطابقت دارد
  • تمام دامنه‌های لازم را به SAN اضافه کنید
  • در صورت نیاز به پوشش چند زیر دامنه، از گواهی Wildcard استفاده کنید
  • اطمینان حاصل کنید گواهی روی سرور و دامنه صحیح نصب شده باشد

جدول خلاصه خطاهای رایج SSL و دلایل آن‌ها:

علتتوضیحراه حل
گواهی SSL نامعتبرگواهی منقضی، اشتباه پیکربندی شده یا Self-Signedتمدید گواهی منقضی، پیکربندی صحیح زنجیره گواهی یا دریافت گواهی معتبر از CA معتبر
ناسازگاری پروتکل SSLسرور و مرورگر نسخه‌های ناسازگار پشتیبانی می‌کنند (مثلاً TLS 1.0 vs 1.3)بروزرسانی پیکربندی سرور برای پشتیبانی از TLS مدرن (1.2+) و فعال‌سازی توافق پروتکل
مشکل ساعت سیستمزمان/تاریخ نادرست باعث شکست اعتبارسنجی گواهی می‌شودهمگام‌سازی زمان سیستم با سرور NTP یا فعال‌سازی همگام‌سازی خودکار
مسدود شدن توسط آنتی‌ویروس یا فایروالابزارهای امنیتی ترافیک SSL را مسدود می‌کنندپیکربندی ابزارهای امنیتی برای اجازه عبور ترافیک SSL/TLS یا غیرفعال‌سازی موقت برای تست
کش یا کوکی‌های مرورگرداده‌های کش خراب می‌تواند جلسات امن را مختل کندپاک‌سازی کش و کوکی مرورگر یا استفاده از حالت خصوصی/Incognito
سیستم‌عامل یا مرورگر قدیمینسخه‌های قدیمی ممکن است از پروتکل‌های SSL/TLS مدرن پشتیبانی نکنندبروزرسانی سیستم‌عامل و مرورگر به نسخه‌های جدید
مشکل DNS یا فایل HostsDNS نادرست یا ورودی‌های سفارشی در Hosts باعث ناسازگاری گواهی می‌شوندبررسی رکوردهای DNS، پاک‌سازی کش DNS و بررسی فایل Hosts
پیکربندی نادرست سرورتنظیمات HTTPS نادرست یا گواهی منقضی روی سروربررسی و بروزرسانی پیکربندی SSL سرور، اطمینان از نصب صحیح گواهی
مشکلات کش SSLکش جلسه SSL خراب باعث شکست Handshake می‌شودپاک‌سازی کش SSL با استفاده از openssl s_client -connect و گزینه -no_ticket یا راه‌اندازی مجدد سرویس‌های SSL
کش DNS سیستمرکوردهای DNS قدیمی باعث مشکلات اعتبارسنجی گواهی می‌شوندپاک‌سازی کش DNS سیستم با دستور systemd-resolve --flush-caches یا راه‌اندازی مجدد سرویس DNS

نصب ابزارهای عیب‌یابی

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

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

sudo apt update

سپس OpenSSL را برای تست گواهی و اتصال نصب کنید:

sudo apt install openssl

ابزار openssl امکانات کاملی برای تستس SSL/TLS ارائه می‌دهد، از جمله اعتبارسنجی گواهی‌ها، تست پروتکل‌ها و بررسی Cipher Suite ها. این ابزار برای تحلیل دقیق مشکلات اتصال بسیار مفید است.

برای تست HTTP/HTTPS، باید curl را نصب کنید:

sudo apt install curl

با curl می‌توانید درخواست‌های HTTP/HTTPS ارسال کنید و اطلاعات دقیق مربوط به اشکال زدایی SSL را دریافت کنید. این اطلاعات برای تشخیص علت مشکلات اتصال بسیار ضروری است.

همچنین nmap را برای اسکن پورت‌ها و سرویس‌های SSL نصب کنید.

sudo apt install nmap

nmap می‌تواند پورت‌های باز را شناسایی کرده و سرویس‌‌های SSL را تست کند، که به شما کمک می‌کند مشکلات پیکربندی شبکه و SSL را در سطح شبکه شناسایی کنید.

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

با سرور لینوکس لیارا، زیرساخت پروژه‌هات رو سریع، پایدار و امن راه‌اندازی کن.
✅ نصب آسان و آماده استفاده✅ منابع اختصاصی و قدرتمند✅ دسترسی کامل SSH
خرید و راه‌اندازی سرور لینوکس

چگونه خطاهای پروتکل SSL را در سمت سرور تشخیص دهیم؟

اکنون که ابزارهای لازم را نصب کرده‌اید، می‌توانیم به صورت سیستماتیک به تشخیص خطاهای پروتکل SSL بپردازیم:

تست اتصال SSL با OpenSSL

از OpenSSL برای تست اتصال SSL به سرور خود استفاده کنید:

openssl s_client -connect your-domain.com:443 -servername your-domain.com

در این دستور your-domain.com را با نام دامنه واقعی خود جایگزین کنید. فلگ -servername برای فعال کردن Server Name Indication (SNI) استفاده می‌شود که برای سرورهایی که چندگواهی SSL دارند ضروری است.

این دستور اطلاعات دقیقی از روند SSL handshake ارائه می‌دهد. به موارد زیر توجه کنید:

  • نسخه پروتکل: باید TLS 1.2 یا TLS 1.3 باشد
  • Cipher Suite: روش رمزنگاری استفاده شده
  • زنجیره گواهی: اعتبار گواهی‌ها
  • وضعیت 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
---

مثال اتصال ناموفق 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 به دلیل خطاهای اعتبارسنجی زنجیره گواهی ناموفق بوده است.

  • unable to get local issuer certificate: به این معنی است که OpenSSL نتوانسته گواهی صادرکننده (Intermediate Certificate) را در store معتبر خود پیدا کند.
  • unable to verify the first certificate: به دلیل خطای قبلی، گواهی اول زنجیره قابل اعتبارسنجی نیست.

راه‌حل:

  • اطمینان حاصل کنید که گواهی‌های میانی (Intermediate Certificates) به درستی روی سرور نصب شده باشند.
  • این شامل دریافت گواهی میانی از CA، نصب آن در مسیر مناسب و تنظیم سرور برای استفاده از آن در handshake می‌شود.

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

بررسی نسخه‌های پشتیبانی شده SSL/TLS

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

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
---

اگر خطای wrong version number دریافت کردید، یعنی سرور از نسخه TLS مورد نظر پشتیبانی نمی‌کند. در این صورت باید تنظیمات SSL/TLS سرور را برای پشتیبانی از نسخه موردنظر به‌روزرسانی کنید.

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
---

برسی مشکلات گواهی SSL

برای مشاهده و جزئیات اعتبار گواهی:

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: تاریخ پایان اعتبار گواهی

برای بررسی Subject و Issuer گواهی:

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 پشتیبانی کرده و نسخه‌های منسوخ شده را غیرفعال کند.

برای وب‌سرور Apache

فایل پیکربندی SSL Apache را ویرایش کنید:

sudo nano /etc/apache2/sites-available/your-site-ssl.conf

داخل بلاک <VirtualHost> تنظیمات SSL را اضافه یا ویرایش کنید:

<VirtualHost *:443>
    ServerName your-domain.com
    DocumentRoot /var/www/your-site
    
    # SSL Configuration
    SSLEngine on
    SSLCertificateFile /path/to/your/certificate.crt
    SSLCertificateKeyFile /path/to/your/private.key
    SSLCertificateChainFile /path/to/your/ca-bundle.crt
    
    # Disable deprecated SSL versions and enable TLS 1.2+
    SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2 +TLSv1.3
    
    # Configure secure cipher suites
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
    SSLHonorCipherOrder off
    
    # Enable HSTS (HTTP Strict Transport Security)
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
</VirtualHost>

دستور SSLProtocol نسخه‌های آسیب‌پذیر SSL/TLS را غیرفعال کرده و نسخه‌های امن (TLS 1.2 و 1.3) را فعال می‌کند.

تست پیکربندی Apache:

sudo apache2ctl configtest

خروجی:

Syntax OK

اگر پیکربندی درست باشد، پیام Syntax OK نمایش داده می‌شود. برای اعمال تغییرات Apache را ری‌لود کنید.

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 Configuration
    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;
    
    # Disable deprecated SSL versions and enable TLS 1.2+
    ssl_protocols TLSv1.2 TLSv1.3;
    
    # Configure secure cipher suites
    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;
    
    # Enable HSTS
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    
    # SSL session optimization
    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 را بدون وقفه در سرویس ری‌لود می‌کند و تغییرات بلافاصله اعمال می‌شوند.

Let’s Encrypt چیست؟ گواهی SSL رایگان برای امنیت وب‌سایت‌ها
Let’s Encrypt چیست؟

چگونه خطاهای مربوط به گواهی را در سمت سرور برطرف کنیم؟

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

بررسی اعتبار گواهی

ابتدا مطمئن شوید گواهی شما منقضی نشده است:

openssl x509 -in /path/to/your/certificate.crt -text -noout | grep -A 2 "Validity"

این دستور بازه اعتبار گواهی را نشان می‌دهد. اگر گواهی منقضی شده باشد، باشد آن را تمدید کنید.

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

زنجیره کامل گواهی شامل گواهی اصلی و گواهی‌های واسط است. برای بررسی آن:

openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts

این دستور تمام گواهی‌های زنجیره را نمایش می‌دهد. مطمئن شوید که زنجیره کامل نصب شده باشد و هیچ گواهی واسطی از قلم نیفتاده باشد.

رفع مشکل عدم تطابق نام دامنه (Hostname Mismatch)

اگر با خطای عدم تطابق نام دامنه مواجه هستید، Subject Alternative Names (SAN) گواهی را بررسی کنید.

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

خروجی باید شامل نام دامنه شما باشد. در غیر این صورت، نیاز به صدور گواهی جدید با نام دامنه صحیح خواهید داشت.

تمدید گواهی‌های Let’s Encrypt

اگر از گواهی‌های Let’s Encrypt استفاده می‌کنید، می‌توانید آن‌ها را با Certbot تمدید کنید:

ابتدا یک آزمایش بدون اعمال تغییر واقعی انجام دهید:

sudo certbot renew --dry-run

فلگ --dry-run فرآیند تمدید را شبیه‌سازی می‌کند بدون اینکه گواهی واقعا تمدید شود.

برای تمدید واقعی، این فلگ را نیز حذف کنید.

sudo certbot renew

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

sudo systemctl restart apache2
# or for Nginx
sudo systemctl restart nginx

چگونه مشکلات مجموعه رمزها (Cipher Suite) را در سمت سرور برطرف کنیم؟

عدم تطابق در Cipher Suite ها می‌تواند باعث شکست در فرآیند SSL handshake شود. برای حل این مشکل باید Cipher Suite های امن و سازگار را در سرور خود پیکربندی کنید.

بررسی Cipher Suite های فعلی

ابتدا بررسی کنید که سرور شما از چه Cipher Suite هایی پشتیبانی می‌کند. دستور زیر را اجرا کنید.

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 های امن

در Apache

برای پیکربندی Cipher Suite های امن، در فایل تنظیمات SSL مقادیر زیر را اضافه کنید.

# Modern cipher suite configuration
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

# Disable weak ciphers
SSLCipherSuite !aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!SRP:!CAMELLIA

در Nginx

برای Nginx نیز می‌توانید از پیکربندی زیر استفاده کنید:

# Modern cipher suite configuration
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;

با این پیکربندی‌ها، شما Cipher Suite های مدرن و امن را در اولویت قرار می‌دهید و در عین حال سازگاری با اکثر کلاینت‌ها حفظ می‌شود.

SSL چیست؟
SSL 

آزمایش و تایید

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

1. بررسی دوباره پیکربندی SSL/TLS

برای شروع، اتصال SSL را دوباره تست کنید:

openssl s_client -connect your-domain.com:443 -servername your-domain.com

در خروجی این دستور باید پیام موفقیت‌آمیز بودن Handshake (دست‌دهی SSL) را ببینید و همچنین نسخه پروتکل باید TLS 1.2 یا بالاتر باشد. اگر نسخه پایین‌تر بود، یعنی هنوز پیکربندی شما امن نیست و باید تغییراتی اعمال کنید.

2. تست با مرورگرهای مختلف

سایت خود را در مرورگرهای مختلف باز کنید، چون هر مرورگر الزامات متفاوتی برای SSL/TLS دارد:

  • Chrome
  • Firefox
  • Safari
  • Edge

این کار باعث می‌شود مطمئن شوید که کاربران در هر مرورگری بدون مشکل به سایت شما دسترسی خواهند داشت.

3. استفاده از ابزارهای آنلاین تست SSL

برای تحلیل جامع SSL سرور خود، می‌توانید از ابزارهای مانند SSL Labs Server Test استفاده کنید. با دستور زیر می‌توانید بررسی را انجام دهید:

curl -s "https://api.ssllabs.com/api/v3/analyze?host=your-domain.com&publish=off&all=done" | jq .

این ابزار گزارش کاملی از وضعیت SSL سرور شما رائه می‌دهد، شامل مواردی مانند قدرت Cipher Suite ها، پشتیبانی از نسخه‌های پروتکل و همچنین مشکلات احتمالی امنیتی.

4. بررسی زنجیره گواهی (Certificate Chain)

یکی از مشکلات رایج SSL، ناقص بودن زنجیره گواهی است. برای بررسی این موضوع دستور زیر را اجرا کنید.

openssl s_client -connect your-domain.com:443 -servername your-domain.com | openssl x509 -noout -text | grep -A 5 "Issuer"

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

مانیتورینگ و نگهداری

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

راه‌اندازی مانیتورینگ تاریخ انقضای گواهی (Certificate Expiration Monitoring)

یکی از رایج ترین خطاهای SSL، منقضی شدن گواهی است. شما می‌توانید سک اسکریپت ساده برای بررسی تاریخ انقضای گواهی ایجاد کنید.

#!/bin/bash
# Certificate expiration check script

DOMAIN="your-domain.com"
DAYS_BEFORE_EXPIRY=30

# Get certificate expiration date
EXPIRY_DATE=$(openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)

# Convert to seconds since epoch
EXPIRY_SECONDS=$(date -d "$EXPIRY_DATE" +%s)
CURRENT_SECONDS=$(date +%s)

# Calculate days until expiry
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

این اسکریپت بررسی می‌کند که آیا گواهی SSL شما کمتر از 30 روز دیگر منقضی می‌‍‌شود یا خیر. در صورت نزدیک بودن تاریخ انقضا، پیام هشدار نمایش داده می‌شود. می‌توانید در بخش Add notification logic here کدی برای ارسال ایمیل یا پیام در اسلک اضافه کنید.

فایل را ذخیره کنید به نام:

/usr/local/bin/check-ssl-expiry.sh

و سپس آن را آماده اجرا کنید.

sudo chmod +x /usr/local/bin/check-ssl-expiry.sh

زمان‌بندی بررسی‌های منظم SSL

برای اجرای روزانه این اسکریپت، یک کران‌جاب (cron job) تنظیم کنید.

sudo crontab -e

و خط زیر را اضافه کنید تا هر روز ساعت 9 صبح گواهی بررسی شود:

0 9 * * * /usr/local/bin/check-ssl-expiry.sh

فعال‌سازی لاگ SSL در وب‌سرور

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

در Apache:

در فایل کانفیگ Virtual Host سطح لاگ SSL را فعال کنید:

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 Protocol Error مواجه می‌شوید، مشکل می‌تواند از سمت مرورگر، سیستم یا شبکه‌ی شما باشد. در ادامه رایج‌ترین روش‌های رفع این خطا را بررسی می‌کنیم.

1. بررسی آدرس وب‌سایت

اطمینان حاصل کنید که آدرس سایت با HTTPS شروع می‌شود نه HTTP.

پروتکل HTTP ایمن نیست و می‌توانید داده‌های شما را در معرض حملات قرار دهد. یک اشتباه تایپی یا پیکربندی نادرست هم ممکن است شما را به یک آدرس ناامن هدایت کند. همیشه قبل از ادامه، مطمئن شوید که در حال استفاده از نسخه‌ی امن سایت هستید.

2. پاک کردن کش (Cache) و کوکی‌های مرورگر

کش یا کوکی‌های خراب شده می‌توانند فرآیند SSL Handshake را مختل کنند. پاک کردن آن‌ها می‌تواند مشکل را رفع کند.

  • Google ChromeSettings > Privacy and Security > Clear browsing data
  • Mozilla FirefoxOptions > Privacy & Security > Cookies and Site Data > Clear Data
  • SafariSafari > Clear History and Website Data
  • Microsoft EdgeSettings > Privacy > Clear browsing data

با این کار تاریخچه، کوکی‌ها و داده‌های ذخیره‌شده حذف می‌شوند و احتمال خطا کاهش می‌یابد.

3. پاک کردن SSL State (ویندوز)

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

  • کلیدهای Windows + R را فشار دهید.
  • عبارت inetcpl.cpl را وارد کرده و Enter بزنید.
  • در پنجره Internet Properties به تب Content بروید.
  • روی گزینه Clear SSL state کلیک کنید.

این کار SSL Cache را پاک کرده و می‌تواند مشکل را برطرف کند.

4. بررسی ساعت و تاریخ سیستم

گواهی‌های SSL بر اساس تاریخ و زمان معتبر می‌شوند. اگر ساعت سیستم شما اشتباه باشد، مرورگر گواهی را منقضی یا نامعتبر تشخیص می‌دهد. مطمئن شوید که تاریخ و زمان سیستم به‌درستی تنظیم شده است.

5. به‌روزرسانی مرورگر

مرورگر قدیمی ممکن است از نسخه های جدید پروتکل SSL/TLS پشتیبانی نکند. برای رفع مشکل مرورگر خود را به آخرین نسخه ارتقا دهید.

  • Google Chrome
  • Mozilla Firefox
  • Safari
  • Microsoft Edge

6. غیر فعال کردن موقت VPN، آنتی‌ویروس یا فایروال

گاهی نرم‌افزارهای امنیتی ارتباطات SSL/TLS را مسدود یا دستکاری می‌کنند. برای تست، آن‌ها را موقتا غیر فعال کنید. اگر مشکل برطرف شد، باید تنظیمات آن نرم‌افزار را تغییر دهید تا دسترسی امن به وب‌سایت امکان‌پذیر شود.

7. بررسی اتصال اینترنت و تنظیمات شبکه

اتصال ضعیف یا تنظیمات نادرست شبکه (مثل DNS) می‌تواند باعث بروز این خطا شود. برای رفع آن:

  • مودم یا روتر را ریستارت کنید.
  • DNS خود را تغییر دهید (مثلاً به 8.8.8.8 یا 1.1.1.1).
  • از یک شبکه‌ی دیگر استفاده کنید.

8. امتحان مرورگر دیگر

اگر خطا تنها در یک مرورگر رخ می‌دهد، ممکن است مشکل مربوط به همان مرورگر باشد. در این صورت:

  • مرورگر دیگری را امتحان کنید.
  • افزونه‌ها (Extensions) را غیرفعال کنید.
  • کش مرورگر مشکل‌دار را پاک کنید.
مفاهیم پایه‌ای OpenSSL: کار با گواهی‌های SSL، کلیدهای خصوصی و درخواست‌های امضای گواهی (CSRs)
OpenSSL

سوالات متداول

در بخش زیر به برخی از سوالات رایج کاربران درباره این موضوع پرداخته و پاسخ آن‌ها را ارائه کرده‌ایم.

خطای SSL Protocol Error به چه معناست؟

وقتی خطای SSL Protocol Error رخ می‌دهد، یعنی در فرآیند handshake بین مرورگر و سرور مشکلی وجود دارد. این مشکل می‌تواند به دلایلی مثل نسخه‌های قدیمی SSL/TLS، پیکربندی نادرست گواهی‌ها یا ایراد در تنظیمات SSL/TLS سرور باشد. این خطا مانع ایجاد اتصال امن می‌شود تا از حفاظت داده‌های شما اطمینان حاصل شود.

علت خطای ERR_SSL_PROTOCOL_ERROR در مرورگر Chrome چیست؟

این خطا معمولاً به دلیل ناسازگاری بین نسخه‌های SSL/TLS مرورگر و سرور رخ می‌دهد. همچنین ممکن است به دلیل گواهی SSL نامعتبر یا منقضی شده، یا پشتیبانی نکردن سرور از پروتکل‌های جدید SSL/TLS باشد. در برخی موارد، آنتی‌ویروس‌ها، فایروال‌ها یا VPNها هم می‌توانند ارتباط SSL/TLS را مختل کرده و باعث بروز این خطا شوند.

چطور در ویندوز SSL State را پاک کنیم؟

برای پاک کردن SSL State در ویندوز مراحل زیر را انجام دهید:

  • کلیدهای Windows + R را فشار دهید تا پنجره Run باز شود.
  • عبارت inetcpl.cpl را وارد کرده و Enter بزنید.
  • در پنجره Internet Properties به تب Content بروید.
  • روی گزینه Clear SSL state کلیک کنید.
    با این کار SSL State پاک می‌شود و ممکن است مشکل خطاهای SSL برطرف شود.

چطور بفهمم خطای SSL از سمت من است یا از سمت سرور؟

برای تشخیص اینکه خطا مربوط به سیستم شماست یا سرور، این موارد را بررسی کنید:

  • ساعت و تاریخ سیستم: مطمئن شوید درست تنظیم شده، چون ساعت نادرست می‌تواند باعث نامعتبر شناخته شدن گواهی SSL شود.
  • مرورگر و سیستم‌عامل: مطمئن شوید به‌روز هستند، چون نسخه‌های قدیمی ممکن است از پروتکل‌های جدید پشتیبانی نکنند.
  • تست در مرورگر دیگر: اگر در یک مرورگر خطا وجود دارد ولی در دیگری نه، احتمالاً مشکل مربوط به همان مرورگر است.
  • آنتی‌ویروس و فایروال: موقتاً آن‌ها را غیرفعال کنید تا مطمئن شوید ارتباط SSL/TLS را مختل نمی‌کنند.
  • تماس با مدیر سایت: اگر هیچ‌کدام از مراحل بالا مشکل را حل نکرد، احتمالاً ایراد از سمت سرور است. در این حالت می‌توانید با مدیر سایت تماس بگیرید یا بعداً دوباره تست کنید.

جمع بندی

خطاهای SSL ممکن است تجربه کاربری را مختل کنند و حتی اعتماد بازدیدکنندگان به وب‌سایت را کاهش دهند. خوشبختانه با کمی دقت در تنظیمات سرور، تمدید به‌موقع گواهی‌ها و مانیتورینگ منظم، می‌توان جلوی بیشتر این مشکلات را گرفت. به یاد داشته باشید که امنیت آنلاین یک فرآیند مداوم است و نیاز به توجه دائمی دارد.

به اشتراک بگذارید