گواهی SSL رایگان — راهنمای کامل نصب و رفع خطاهای HTTPS
از صدور خودکار گواهی SSL رایگان تا رفع خطای زنجیره گواهی و mixed content؛ هرچه برای درست کار کردن HTTPS روی سایتتان لازم است، بدون آزمون و خطا.
HTTPS دیگر یک قابلیت لوکس نیست؛ مرورگرها سایت بدون آن را «ناامن» علامت میزنند و بخشی از APIهای مدرن مرورگر اصلاً روی HTTP کار نمیکنند. اما بین «گواهی SSL رایگان گرفتم» و «HTTPS سایتم درست کار میکند» فاصلهای هست که خیلیها فقط وقتی متوجه آن میشوند که یک اپلیکیشن اندروید یا یک وبهوک بانکی از کار میافتد. این راهنما دقیقاً همان فاصله را پر میکند.
TLS واقعاً از چه چیزی محافظت میکند
نام درستش TLS است؛ SSL اسم نسخههای قدیمی و منسوخ همان پروتکل است که در محاوره باقی مانده. TLS سه چیز را تضمین میکند:
- محرمانگی — کسی که وسط مسیر نشسته محتوای درخواست و پاسخ را نمیبیند.
- یکپارچگی — بستهها در مسیر دستکاری نمیشوند؛ تزریق اسکریپت تبلیغاتی توسط شبکه واسط بسته میشود.
- احراز هویت سرور — کلاینت مطمئن میشود با همان دامنهای حرف میزند که در نوار آدرس نوشته شده.
و مهمتر، از چه چیزی محافظت نمیکند: TLS جلوی SQL injection، افزونه آسیبپذیر وردپرس، اسکن باتها یا حمله حجمی را نمیگیرد. قفل سبز فقط یعنی مسیر امن است، نه اینکه چیزی که از آن مسیر میآید سالم است. محافظت از خود اپلیکیشن کار WAF و سپر ضد DDoS است، نه کار گواهی.
DV، OV و EV: کدام یکی برای شما کافی است
هر سه نوع گواهی دقیقاً از یک الگوریتم رمزنگاری استفاده میکنند. تفاوت فقط در این است که صادرکننده چقدر درباره هویت شما تحقیق کرده، نه اینکه اتصال چقدر امن است.
| نوع گواهی | چه چیزی تأیید میشود | زمان صدور | تفاوت در مرورگر |
|---|---|---|---|
| DV | فقط کنترل شما بر دامنه | چند دقیقه، خودکار | هیچ |
| OV | ثبت حقوقی سازمان | چند روز کاری | فقط در جزئیات گواهی |
| EV | بررسی حقوقی سختگیرانه | روزها تا هفتهها | هیچ |
از سال ۲۰۱۹ مرورگرها نوار سبز و نمایش نام شرکت برای EV را حذف کردهاند. یعنی کاربر شما بدون باز کردن جزئیات گواهی هیچ راهی ندارد بفهمد کدام نوع را خریدهاید. برای اکثر سایتها گواهی DV رایگان کاملاً کافی است؛ OV و EV فقط وقتی معنی دارند که یک الزام قراردادی یا رگولاتوری شما را مجبور کرده باشد.
صدور و تمدید خودکار چطور کار میکند
استاندارد ACME صدور گواهی را از یک فرایند اداری به یک تماس API تبدیل کرد. منطق ساده است: صادرکننده یک چالش میدهد، شما ثابت میکنید دامنه را کنترل میکنید، گواهی صادر میشود.
دو نوع چالش رایج
- HTTP-01 — باید یک فایل مشخص را زیر مسیر
/.well-known/acme-challenge/سرو کنید. سریع است، ولی برای دامنه wildcard کار نمیکند و اگر سایت پشت لاگین یا فایروال باشد شکست میخورد. - DNS-01 — باید یک رکورد TXT با نام
_acme-challengeبسازید. برای گواهی wildcard تنها گزینه است و نیازی به در دسترس بودن وبسرور ندارد.
اگر روی دامنهتان رکورد CAA تعریف کرده باشید، فقط صادرکنندههای نامبردهشده در آن رکورد اجازه صدور دارند؛ یک CAA فراموششده از پیمانکار قبلی، شایعترین دلیل شکست بیدلیل صدور است. اگر با انواع رکوردها راحت نیستید، راهنمای رکوردهای DNS همهشان را با مثال توضیح داده است.
عمر گواهیهای رایگان کوتاه است — معمولاً ۹۰ روز و در حال کوتاهتر شدن. این یعنی تمدید دستی عملاً یک بمب ساعتی است: یک یادآوری تقویم که بالاخره یک روز نادیده گرفته میشود. در nsin گواهی از خود لبه سرو میشود و تمدید آن خودکار انجام میگیرد؛ نیازی نیست چیزی روی سرور خودتان نصب یا cron تنظیم کنید. جزئیات و حالتهای خاص در مستندات آمده است.
SSL لبه و SSL مبدأ: پای دوم مسیر را فراموش نکنید
وقتی سایت پشت CDN است، مسیر دو پا دارد: کاربر تا لبه، و لبه تا سرور مبدأ شما. قفل سبز در مرورگر فقط درباره پای اول حرف میزند.
اگر پای دوم رمزنگارینشده باشد، ترافیک بین لبه و سرور شما — شامل کوکی نشست و داده فرمها — روی شبکههای میانی قابل شنود است. توصیه ساده است: روی مبدأ هم یک گواهی معتبر بگذارید و اتصال لبه به مبدأ را روی HTTPS تنظیم کنید.
یک باگ خیلی رایج هم دقیقاً همینجا متولد میشود: لبه با HTTP به مبدأ وصل میشود، مبدأ هر درخواست HTTP را به HTTPS ریدایرکت میکند، و نتیجه ERR_TOO_MANY_REDIRECTS است. حلقه از سمت مبدأ میآید، نه از گواهی.
نکتهای که در ایران بیشتر از هر جای دیگری اهمیت دارد: چون HTTPS در nsin از لبه سرو میشود، حتی وقتی مبدأ در دسترس نیست، بازدیدکننده با خطای گواهی روبهرو نمیشود و نسخه کششده صفحه را میبیند. یک سرور خاموش نباید به هشدار قرمز امنیتی در مرورگر تبدیل شود.
زنجیره گواهی و باگ «در کروم کار میکند، در curl نه»
اعتماد در TLS زنجیرهای است: گواهی سایت شما (leaf) را یک گواهی میانی (intermediate) امضا میکند و آن گواهی میانی هم امضای ریشه (root) را دارد؛ ریشه از قبل در trust store دستگاه کاربر نصب است. وظیفه سرور این است که leaf و intermediate را با هم بفرستد؛ ریشه را نباید بفرستد، چون کلاینت خودش آن را دارد.
حالا فرض کنید intermediate جا افتاده. کروم و فایرفاکس معمولاً یا آن را از قبل کش کردهاند یا با AIA fetching خودشان میروند و میگیرند، پس سایت درست باز میشود. اما curl، اندروید قدیمی، کلاینتهای Java، requests پایتون، درگاههای پرداخت و اکثر وبهوکها این کمبود را جبران نمیکنند و اتصال را رد میکنند. نتیجه: سایت روی مرورگر شما بیعیب است و برای بخشی از مصرفکنندههای API خراب — بدترین نوع باگ، چون خودتان آن را نمیبینید.
گواهی معتبر یعنی زنجیره کامل در همان چیزی که سرور میفرستد؛ هر چیز کمتر از آن یک باگ زماندار است که فقط بعضی کلاینتها آن را میبینند.
تست قطعی، بدون حدس و گمان:
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null
اگر در خروجی فقط یک بلوک CERTIFICATE دیدید، زنجیره ناقص است. باید حداقل دو تا باشد. curl -vI https://example.com هم اگر با خطای unable to get local issuer certificate برگشت، همین مشکل را تأیید میکند.
خطاهای رایج مرورگر و دلیل واقعیشان
| خطا | دلیل واقعی |
|---|---|
ERR_CERT_COMMON_NAME_INVALID | دامنه درخواستشده در فهرست SAN گواهی نیست — معمولاً گواهی برای example.com صادر شده ولی کاربر www.example.com را باز کرده |
ERR_CERT_DATE_INVALID | گواهی منقضی شده، یا ساعت و تاریخ دستگاه کاربر اشتباه است |
ERR_CERT_AUTHORITY_INVALID | گواهی self-signed است، یا intermediate در زنجیره ارسال نشده |
ERR_SSL_PROTOCOL_ERROR | سرور روی پورت 443 اصلاً TLS صحبت نمیکند، یا نسخه پروتکل با کلاینت ناسازگار است |
ERR_CERT_REVOKED | گواهی توسط صادرکننده باطل شده؛ باید گواهی جدید صادر شود |
ERR_TOO_MANY_REDIRECTS | حلقه ریدایرکت بین لبه و مبدأ، نه مشکل گواهی |
| تصویر یا ویدئو بارگذاری نمیشود و کنسول هشدار mixed content میدهد | منابع HTTP داخل صفحه HTTPS |
mixed content بعد از مهاجرت به HTTPS
بعد از فعال شدن HTTPS، هر منبعی که هنوز با http:// بارگذاری شود مشکلساز است. مرورگر دو رفتار متفاوت دارد:
- فعال (script، CSS، iframe، XHR): مستقیماً بلاک میشود. اسلایدر کار نمیکند، فرم ارسال نمیشود.
- غیرفعال (تصویر، ویدئو): مرورگرهای امروزی خودشان درخواست را به HTTPS ارتقا میدهند و اگر نسخه HTTPS در دسترس نباشد، منبع اصلاً بارگذاری نمیشود.
منبع اصلی این آدرسها در وردپرس، URLهای مطلق ذخیرهشده داخل دیتابیس است؛ عوض کردن آدرس سایت در تنظیمات کافی نیست و باید روی جدول محتوا و متادادهها search-replace بزنید. هدر Content-Security-Policy: upgrade-insecure-requests را هم بهعنوان تور ایمنی بگذارید، نه راهحل اصلی.
در پایان کار، ریدایرکت 301 از HTTP به HTTPS را روی لبه اعمال کنید و آدرس canonical و sitemap را هم بهروزرسانی کنید. حواستان به زنجیره ریدایرکت باشد: http://example.com → https://example.com → https://www.example.com یعنی دو رفتوبرگشت اضافه قبل از اولین بایت که مستقیم روی Core Web Vitals و بهخصوص LCP اثر میگذارد. یک پرش، نه دو تا.
HSTS: وقتی HTTPS اجباری میشود
با هدر Strict-Transport-Security به مرورگر میگویید تا مدت مشخصی حتی یک درخواست HTTP هم به این دامنه نفرستد. این جلوی حمله SSL stripping را میگیرد، چون دیگر آن درخواست اول ناامن وجود ندارد که کسی بتواند رهگیریاش کند.
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
سه هشدار جدی: با max-age=300 شروع کنید و بعد از اطمینان بالا ببرید. includeSubDomains یعنی همه زیردامنهها باید HTTPS معتبر داشته باشند، وگرنه از دسترس خارج میشوند. و preload عملاً برگشتناپذیر است — خارج شدن از فهرست preload مرورگرها ماهها طول میکشد.
پرسشهای متداول
گواهی SSL رایگان با گواهی پولی چه فرقی دارد؟
از نظر قدرت رمزنگاری و آنچه کاربر میبیند، هیچ فرقی ندارد. تفاوت در سطح تأیید هویت (DV در برابر OV و EV) و در بیمهنامهای است که بعضی صادرکنندههای تجاری ارائه میدهند. برای اکثریت سایتها، گواهی DV رایگان انتخاب درست است.
نصب SSL روی سایت چقدر طول میکشد؟
اگر دامنه از قبل به سرویس متصل باشد، صدور خودکار معمولاً در حد چند دقیقه است. اگر تازه رکوردهای DNS را عوض کردهاید، باید منتظر انتشار DNS بمانید؛ همینجا TTL پایین قبل از تغییر به شما کمک میکند. روش انتقال بدون قطعی را در راهنمای اتصال CDN بدون داونتایم توضیح دادهایم.
آیا فعال کردن HTTPS سایت را کند میکند؟
نه به شکل محسوس. TLS 1.3 تعداد رفتوبرگشتهای لازم برای برقراری اتصال را به یکی کاهش داده و اتصالهای بعدی با session resumption عملاً بدون تأخیر اضافه برقرار میشوند. در عوض HTTP/2 و HTTP/3 فقط روی HTTPS در دسترساند، پس خالص اثر معمولاً مثبت است.
چرا بعد از نصب SSL قفل سبز نمایش داده نمیشود؟
تقریباً همیشه mixed content است. کنسول مرورگر را باز کنید؛ هر منبع HTTP با هشدار مشخص گزارش میشود. اگر کنسول تمیز بود ولی بعضی کلاینتها خطا میدهند، سراغ زنجیره گواهی و intermediate گمشده بروید.
قدم بعدی
اگر هنوز روی HTTP هستید یا گواهی را دستی تمدید میکنید، این وظیفه را کلاً از روی سرور خودتان بردارید. دامنه را در پنل nsin اضافه کنید تا HTTPS با تمدید خودکار از لبه ارائه شود؛ هر دامنه جدید یک دوره آزمایشی هفتروزه کامل دارد و در همان مدت میتوانید زنجیره گواهی، ریدایرکتها و mixed content را با لاگ زنده درخواستها بررسی و تمیز کنید.