گواهی آماده است؛ اکنون آن را روی سایت نصب می‌کنیم و انتخاب گواهی را از انتخاب 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 .