انجیناکس؛ شب ۱۲: HTTPS، SNI و ورودی ناشناس
فهرست نوشته
گواهی آماده است؛ اکنون آن را روی سایت نصب میکنیم و انتخاب گواهی را از انتخاب Host در HTTP جدا میسنجیم.
این جلسه بخشی از دورهٔ انجیناکس در ۵۰ شب است. قرارداد آزمایشگاه، مسیرها و روال اعمال تغییر در راهنمای دوره آمده است.
محیط: فایلهای شب یازدهم روی وبسرور، ماژول HTTP SSL موجود و نسخهٔ Nginx حداقل 1.19.4 برای ssl_reject_handshake.
کلید و سایت#
sudo install -d -m 750 /etc/nginx/tls
sudo install -m 600 ~/nginx-lab/pki/web.key /etc/nginx/tls/web.key
sudo install -m 644 ~/nginx-lab/pki/web.crt /etc/nginx/tls/web.crt
sudo install -m 644 ~/nginx-lab/pki/ca.crt /etc/nginx/tls/ca.crt
در RHEL label مسیر را با policy TLS/config بررسی و restorecon کن. server www قبلی را روی HTTPS ببر؛ سایر root، location و logهای آن باقی میمانند:
listen 443 ssl;
ssl_certificate /etc/nginx/tls/web.crt;
ssl_certificate_key /etc/nginx/tls/web.key;
این خطوط داخل server جای listen 80 را میگیرند. برای پورت 80 بلوک redirect شب دهم را جدا اضافه کن. در فایل default یک server دیگر بساز:
server {
listen 443 ssl default_server;
server_name _;
ssl_reject_handshake on;
return 404;
}
این پیشفرض handshake با نام ناشناس را رد میکند؛ Host ناشناس پس از handshake معتبر نیز محتوا نمیگیرد. SNI نام ارسالشده هنگام TLS است و پیش از هدر Host میآید.
آزمون بدون دور زدن اعتماد#
curl --cacert ~/nginx-lab/pki/ca.crt \
--resolve www.nginx.test:443:192.168.57.10 https://www.nginx.test/
openssl s_client -connect 192.168.57.10:443 -servername www.nginx.test \
-verify_hostname www.nginx.test -CAfile ~/nginx-lab/pki/ca.crt \
-verify_return_error </dev/null
با IP شاخهٔ RHEL جایگزین کن. نام غلط، CA نپذیرفته و SNI ناشناس را جدا تست کن؛ -k اصلاح مسئله نیست. برای نام ناشناس انتظار شکست TLS و برای www محتوای درست داریم.
بازگشت: listener و فایلهای نسخهٔ سالم را برگردان و test/reload انجام بده. کلید private نباید در webroot یا archive عمومی قرار بگیرد.
منبع: HTTPS در Nginx ، ssl_reject_handshake .