آپاچی؛ شب ۱۴: سیاست TLS و HSTS با امکان بازگشت
فهرست نوشته
HTTPS فعال است، اما نسخههای پروتکل و رفتار مرورگر هنوز باید مشخص شوند. امشب TLS را محدود میکنیم و HSTS را ابتدا با زمان کوتاه آزمایش میکنیم.
این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نامها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.
محیط: HTTPS معتبر شب دوازدهم، OpenSSL 3 و ماژول headers؛ سایت ثابت www.
نسخه و الگوریتم دو انتخاب جدا هستند#
برای سایت آزمایشگاهی، SSLProtocol را در فایل global اختصاصی دوره بگذار تا میزبانهای TLS بعدی نیز همین پایه را داشته باشند:
SSLProtocol -all +TLSv1.2 +TLSv1.3
هدر HSTS در VirtualHost پورت 443 قرار میگیرد:
Header always set Strict-Transport-Security "max-age=300"
TLS 1.2 و TLS 1.3 نسخههای پروتکلاند. Cipher suite مجموعهٔ الگوریتمهای مذاکرهشده است؛ فهرست سازگار را با سیاست رمزنگاری توزیع و مشتریهای سرویس انتخاب کن. در RHEL، تنظیم دستی میتواند از crypto policy سیستم فاصله بگیرد؛ صرف کپی یک فهرست cipher از اینترنت تصمیم امنیتی محسوب نمیشود.
HSTS به مرورگر میگوید مراجعههای بعدی را با HTTPS انجام بدهد. includeSubDomains و preload تعهد گستردهتری دارند؛ تا همهٔ نامها و مسیر بازیابی آماده نیستند، آنها را اضافه نکن.
برای هدایت HTTP، محتوای بلوک پورت 80 همان سایت را با نام ثابت و این قانون جایگزین کن؛ میزبان catchall را نگه دار:
<VirtualHost *:80>
ServerName www.example.test
Redirect permanent / https://www.example.test/
</VirtualHost>
در دامنهٔ عمومی روش ACME و دسترسی challenge را پیش از این تغییر بررسی کن.
آزمایش جداگانه#
curl --cacert ~/apache-lab/pki/ca.crt \
--resolve www.example.test:443:192.168.56.10 \
--tlsv1.2 --tls-max 1.2 -I https://www.example.test/
openssl s_client -connect 192.168.56.10:443 \
-servername www.example.test -tls1_3 \
-CAfile ~/apache-lab/pki/ca.crt -verify_return_error </dev/null
باید هر دو نسخهٔ مجاز و هدر HSTS را ببینی. برای نسخهٔ قدیمی انتظار شکست داریم، اما خطای cipher محلی OpenSSL بهتنهایی اثبات رد شدن در سرور نیست؛ محل شکست را از handshake و لاگ تشخیص بده.
بازگشت: تنظیم TLS و redirect را از backup بازیابی کن. حذف هدر، HSTS ذخیرهشده در مرورگر را فوری پاک نمیکند؛ روی اتصال HTTPS معتبر max-age=0 ارسال کن یا تا انقضا منتظر بمان. به همین دلیل شروع با 300 ثانیه است.
منبع: SSLProtocol در Apache ، HSTS در MDN .