SSL رایگان با CDN؛ حالت انعطافپذیر، کامل و سختگیرانه
قفل سبز مرورگر بهتنهایی نشان نمیدهد مسیر میان CDN و سرور مبدأ رمزگذاری شده است. این راهنما فرق سه حالت SSL، علت و درمان حلقهی هدایت در حالت انعطافپذیر و روش مرحلهای فعال کردن HSTS را با فرمانهای آماده توضیح میدهد.

گواهی SSL رایگان در CDN ابر ویرا قفل مرورگر را بیدردسر روشن میکند، اما همین قفل تنها نیمی از ماجراست. حالتی که برای SSL انتخاب میکنید (انعطافپذیر، کامل یا سختگیرانه) تعیین میکند که مسیر میان لبهی CDN و سرور مبدأ هم رمزگذاری شده باشد یا نه، و انتخاب نادرست آن رایجترین علت خطای «تعداد زیاد هدایت» است. این نوشته پاسخ عملی به سه پرسش است: هر حالت دقیقاً چه میکند، حلقهی هدایت چرا پیش میآید و چطور برطرف میشود، و HSTS را کی و چطور روشن کنیم.
اگر هنوز دامنه را به CDN نیاوردهاید، مراحل افزودن دامنه و تغییر نامسرور در راهنمای راه اندازی CDN ایران گامبهگام آمده است؛ اینجا فرض بر این است که دامنه روی لبه فعال است.
SSL رایگان روی لبه؛ دو مسیر، سه حالت
هر درخواست HTTPS از پشت CDN دو بخش دارد: از مرورگر تا نود لبه، و از نود لبه تا سرور مبدأ. گواهی رایگانی که در CDN ایران صادر میشود همیشه بخش نخست را رمزگذاری میکند. حالت SSL دربارهی بخش دوم تصمیم میگیرد:
| حالت | مرورگر تا لبه | لبه تا مبدأ | گواهی لازم روی مبدأ | کاربرد مناسب |
|---|---|---|---|---|
| انعطافپذیر | HTTPS | HTTP رمزنشده | ندارد | فقط دورهی گذار، تا نصب گواهی روی مبدأ |
| کامل | HTTPS | HTTPS | هر گواهی، حتی خودامضا | وقتی گواهی معتبر روی مبدأ هنوز ممکن نیست |
| سختگیرانه | HTTPS | HTTPS با وارسی گواهی | گواهی معتبر، همنام دامنه و منقضینشده | حالت هدف برای هر سایت جدی |
حالت انعطافپذیر چه چیزی را پنهان میکند؟
در این حالت کاربر قفل را میبیند، ولی گذرواژهها، کوکیهای نشست و دادهی فرمها میان لبه و مبدأ بیرمز جابهجا میشوند. برای سایتی که ورود کاربر، پرداخت یا پنل مدیریت دارد، این حالت را تنها چند ساعت یا چند روز و تا نصب گواهی روی مبدأ نگه دارید.
کامل یا سختگیرانه؟
حالت کامل مسیر را رمزگذاری میکند اما هویت سرور مبدأ را نمیسنجد؛ یعنی جلوی شنود را میگیرد، نه جلوی جعل مبدأ را. حالت سختگیرانه افزون بر رمزگذاری، بررسی میکند که گواهی مبدأ را مرجعی معتبر صادر کرده باشد، نام آن با دامنه بخواند و تاریخش نگذشته باشد. هر جا گواهی معتبر روی مبدأ دارید، سختگیرانه را انتخاب کنید.
حلقهی هدایت در حالت انعطافپذیر: علت و راهحل
نشانهی آشنا این است: مرورگر پیام «تعداد هدایتها بیش از حد است» (ERR_TOO_MANY_REDIRECTS) میدهد و صفحه هرگز باز نمیشود. زنجیرهی رخداد این است:
- کاربر نشانی https را باز میکند و درخواست با HTTPS به لبه میرسد.
- لبه در حالت انعطافپذیر درخواست را با HTTP به مبدأ میفرستد.
- وبسرور یا CMS مبدأ میبیند درخواست HTTP است و طبق قاعدهی خودش پاسخ 301 به نشانی https میدهد.
- مرورگر دوباره https را درخواست میکند و چرخه از گام ۱ تکرار میشود.
مبدأ هیچوقت درخواست HTTPS نمیبیند، پس هدایت هیچوقت پایان نمییابد.
تشخیص با curl
پیش از هر تغییری، حلقه را با این فرمان تأیید کنید:
curl -sIL --max-redirs 5 https://example.com | grep -iE "^HTTP|^location"اگر چند خط پیاپی 301 با Location یکسان به همان نشانی https دیدید و فرمان با پیام سقف هدایت متوقف شد، مشکل همین حلقه است.
راهحل اصلی: گواهی روی مبدأ و رفتن به حالت کامل یا سختگیرانه
درمان ریشهای این است که لبه با HTTPS به مبدأ وصل شود؛ آنوقت مبدأ درخواست HTTPS میبیند و هدایتی نمیدهد. روش کار در بخش گامبهگام پایین آمده است.
راه موقت: برداشتن هدایت از مبدأ
اگر همین حالا نمیتوانید گواهی نصب کنید، هدایت HTTP به HTTPS را از مبدأ بردارید؛ مثلاً در Nginx خط return 301 را در بلوک درگاه ۸۰ غیرفعال کنید و sudo nginx -t && sudo systemctl reload nginx را اجرا کنید. در وردپرس، اگر نشانی سایت با https ثبت شده و حلقه ادامه دارد، برخی راهنماها خواندن سرآیند X-Forwarded-Proto را پیشنهاد میکنند؛ پیش از تکیه بر آن، در لاگ مبدأ بررسی کنید که این سرآیند واقعاً از لبه میرسد. این راه تنها مسکن است و مسیر لبه تا مبدأ همچنان بیرمز میماند.
گامبهگام: از انعطافپذیر به سختگیرانه بدون قطعی
۱. گواهی را روی مبدأ بگیرید. روی اوبونتو یا دبیان با Nginx:
sudo apt update
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.comروی آلمالینوکس یا راکیلینوکس ابتدا sudo dnf install epel-release و سپس sudo dnf install certbot python3-certbot-nginx را اجرا کنید. درخواست راستیآزمایی certbot از مسیر /.well-known/acme-challenge/ و از پشت لبه به مبدأ میرسد؛ اگر برای این مسیر کش یا قاعدهی دیوار آتش وب تعریف کردهاید، با قوانین مسیر آن را از کش و مسدودسازی بیرون بگذارید.
۲. گواهی مبدأ را مستقیم و بیواسطهی لبه بسنجید. بهجای ORIGIN_IP آیپی سرور خودتان را بگذارید:
curl -svo /dev/null --resolve example.com:443:ORIGIN_IP https://example.com 2>&1 | grep -iE "subject|expire|verify"باید نام دامنه در subject، تاریخ انقضای آینده و عبارت SSL certificate verify ok را ببینید.
۳. در پنل CDN حالت SSL را روی «کامل» بگذارید و سایت را در پنجرهی ناشناس مرورگر باز کنید.
۴. پس از اطمینان، به «سختگیرانه» بروید. اگر خطای اتصال به مبدأ دیدید، یعنی گواهی در وارسی گام ۲ ایراد داشته است؛ موقتاً به «کامل» برگردید و گواهی را اصلاح کنید.
۵. حالا هدایت HTTP به HTTPS را روی مبدأ برگردانید. دیگر حلقهای ساخته نمیشود:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}۶. تمدید خودکار را بیازمایید: sudo certbot renew --dry-run. در حالت سختگیرانه، گواهی منقضی یعنی از دسترس افتادن سایت.
۷. پایش سلامت مبدأ را در پنل CDN روشن کنید تا اگر اتصال لبه به مبدأ قطع شد، زودتر از کاربران باخبر شوید.
برای اطمینان، فرمان تشخیص حلقه را دوباره اجرا کنید؛ باید تنها یک پاسخ HTTP/2 200 یا HTTP/1.1 200 ببینید.
HSTS: قفل کردن مرورگر روی HTTPS
سرآیند Strict-Transport-Security به مرورگر میگوید تا مدت معین، این دامنه را هرگز با HTTP باز نکند؛ حتی اگر کاربر نشانی را بدون https تایپ کند. این کار جلوی حملههایی را میگیرد که در همان نخستین درخواست HTTP اتصال را میربایند. اما چون مرورگر این دستور را به خاطر میسپارد، اشتباه در آن بهسادگی پس گرفته نمیشود؛ پس مرحلهای پیش بروید.
مقدار max-age را پلهپله بالا ببرید
- آزمون:
max-age=300(پنج دقیقه). اگر جایی شکست، اثرش زود از بین میرود. - میانی:
max-age=86400(یک روز) برای چند روز، همراه با پایش خطاها. - نهایی:
max-age=31536000(یک سال) وقتی مطمئن شدید همهچیز پایدار است.
در Nginx سرآیند را داخل بلوک server درگاه ۴۴۳ بگذارید:
add_header Strict-Transport-Security "max-age=300" always;و حضورش را از پشت لبه بسنجید:
curl -sI https://example.com | grep -i strict-transportگزینهی includeSubDomains را فقط وقتی اضافه کنید که همهی زیردامنهها، حتی آنهایی که پشت CDN نیستند، HTTPS سالم دارند. گزینهی preload و ثبت دامنه در فهرست پیشبارگذاری مرورگرها تصمیمی تقریباً بیبازگشت است؛ تا ماهها بعد از پایداری سراغش نروید.
فهرست وارسی پیش از روشن کردن HSTS
- حالت SSL روی سختگیرانه یا دستکم کامل است، نه انعطافپذیر.
- فرمان تشخیص حلقه تنها یک پاسخ 200 برمیگرداند.
- صفحهها محتوای مختلط ندارند؛ کنسول مرورگر هشدار Mixed Content نشان نمیدهد.
certbot renew --dry-runبیخطا اجرا میشود.- فهرست زیردامنهها را نوشتهاید و وضعیت HTTPS هر کدام را میدانید.
هزینه: گواهی رایگان، تنها دانلود حساب میشود
گواهی SSL رایگان هزینهی جداگانهای ندارد و تغییر حالت آن هم بیهزینه است؛ آنچه حساب میشود مصرف دانلود از لبه است و آپلود رایگان است. نرخها به تاریخ آبان ۱۴۰۵: هر گیگابایت دانلود CDN ۱٬۲۰۰ تومان. برای سایتی با ۲۰۰ گیگابایت دانلود در ماه:
«۲۰۰ گیگابایت × ۱٬۲۰۰ تومان = ۲۴۰٬۰۰۰ تومان»
اگر میخواهید گذار به حالت سختگیرانه و تنظیم HSTS را پیش از دست زدن به سرور اصلی روی یک مبدأ آزمایشی تمرین کنید، طرح «اقتصادی ۱» سرور ابری ساعتی ۱٬۰۲۷ تومان در ساعت است:
«۴ ساعت × ۱٬۰۲۷ تومان = ۴٬۱۰۸ تومان»
به این رقم، دانلود سرور با نرخ ۱٬۰۰۰ تومان برای هر گیگابایت افزوده میشود. کسر از کیف پول بهازای هر ساعت کامل است و ساعت ناقص به دور بعد میرود؛ پس از آزمون سرور را حذف کنید، چون خاموش کردن هزینهی ساعتی را متوقف نمیکند. جزئیات سفارش در راهنمای خرید سرور ساعتی ایران آمده و بهای روز را ماشینحساب صفحهی سفارش نشان میدهد.
اشتباههای رایج
۱. هدایت به HTTPS روی مبدأ در حالت انعطافپذیر. نتیجه همان حلقهی هدایت است. راه پرهیز: یا پیش از روشن کردن ابر گواهی مبدأ را نصب کنید و مستقیم به کامل یا سختگیرانه بروید، یا تا آن زمان هدایت را روی مبدأ غیرفعال نگه دارید.
۲. رفتن به سختگیرانه با گواهی خودامضا یا ناهمنام. لبه اتصال را رد میکند و کل سایت از دسترس میافتد. راه پرهیز: پیش از تغییر حالت، فرمان curl با --resolve را اجرا کنید و تا verify ok را ندیدهاید، روی «کامل» بمانید.
۳. HSTS یکساله با includeSubDomains در روز اول. اگر زیردامنهای مثل پنل داخلی یا ایمیل تحت وب گواهی نداشته باشد، کاربرانی که سرآیند را گرفتهاند تا یک سال به آن دسترسی ندارند. راه پرهیز: با max-age=300 و بدون includeSubDomains شروع کنید و پس از وارسی همهی زیردامنهها مقدار را بالا ببرید.
پرسشهای متداول
با SSL رایگان CDN، باز هم به گواهی روی سرور مبدأ نیاز دارم؟
برای حالت انعطافپذیر نه، اما همین حالت مسیر لبه تا مبدأ را بیرمز میگذارد. برای حالت کامل هر گواهی و برای سختگیرانه گواهی معتبر روی مبدأ لازم است؛ پس عملاً بله.
چرا پس از روشن کردن HTTPS برخی تصویرها یا فایلها بار نمیشوند؟
احتمالاً صفحه هنوز منابعی را با نشانی http فراخوانی میکند و مرورگر آنها را بهعنوان محتوای مختلط مسدود میکند. نشانیها را در قالب، پایگاه داده یا تنظیمات CMS به https یا نشانی نسبی تغییر دهید.
اگر گواهی مبدأ در حالت سختگیرانه منقضی شود چه رخ میدهد؟
لبه اتصال به مبدأ را نمیپذیرد و کاربران بهجای سایت خطا میبینند. تمدید خودکار را با certbot renew --dry-run بیازمایید و پایش سلامت مبدأ را روشن نگه دارید تا زود باخبر شوید.
اگر HSTS را اشتباه فعال کردم، چطور اثرش را برگردانم؟
سرآیند را با max-age=0 و از روی HTTPS بفرستید؛ مرورگر هر کاربر در بازدید بعدی دستور قبلی را پاک میکند. کاربرانی که دوباره سر نزنند تا پایان max-age قبلی تحت تأثیر میمانند، و خروج از فهرست preload بهمراتب کندتر است.
جمعبندی
گواهی SSL رایگان روی لبه نقطهی شروع است، نه پایان کار. حالت انعطافپذیر را فقط برای دورهی گذار نگه دارید، با نصب گواهی روی مبدأ به کامل و سپس سختگیرانه بروید تا حلقهی هدایت از ریشه برطرف شود، و HSTS را با max-age کوچک آغاز کنید و پلهپله بالا ببرید. اگر میخواهید این مسیر را روی دامنهی خودتان پیاده کنید، میتوانید CDN و سرور مبدأ را در ابر ویرا راه بیندازید و هر سه حالت SSL را از همان پنل بیازمایید.



