启用 ssl_reject_handshake on 可在 TLS 握手初始阶段拒绝未匹配合法域名的请求,不发证书、不建连接、不写日志;须置于 http 块顶层,仅对 listen 443 ssl 的 server 生效,需显式配置 server_name 且禁用通配符与 default_server。
启用 ssl_reject_handshake on 能在 TLS 握手最初阶段就拒绝未匹配合法域名的请求,不发证书、不建连接、不写访问日志,是阻断恶意 HTTPS 扫描和 SNI 探测最干净的方式。
这个指令只在 HTTP 模块生效,且必须全局启用:
nginx.conf 的 http { } 块最上方添加 ssl_reject_handshake on;
server 块里,也不支持 if 判断或条件开关listen 443 ssl 的 server 生效,不影响 HTTP(80 端口)nginx -s reload 即可生效,无需重启进程启用后,Nginx 会严格比对客户端在 TLS 握手中发送的 SNI 字段:
server_name example.com www.example.com api.example.com;
server_name *.example.com;——所有子域都会通过,等于放弃防护default_server——它会接管未匹配请求并返回证书,彻底抵消拦截效果别只看配置是否存在,要用真实工具观察 TLS 层行为:
openssl s_client -connect 1.2.3.4:443 -servername fake.test.com -tls1_2,成功拦截时输出含 SSL routines::UNRECOGNIZED_NAME,且无 Certificate: 段curl -vI https://1.2.3.4 应卡在 TLS 握手阶段失败,看不到 Server Hello,浏览器报 ERR_SSL_UNRECOGNIZED_NAME_ALERT
openssl s_client -connect 1.2.3.4:443 -servername example.com 应正常完成握手并显示证书信息单靠 ssl_reject_handshake 不足以覆盖全部风险,建议同步做几项轻量但关键的加固:
server { listen 80 default_server; return 444; },防止 80 端口暴露服务指纹ssl_protocols TLSv1.2 TLSv1.3;,禁用弱加密套件$ssl_server_name,便于识别高频空值或异常 SNI 请求