我有一个 Nginx 实例,使用 SNI 从单个 IP 为多个 HTTPS 域提供服务。
设置的唯一故障是,每当请求服务器裸 IP 的 URL 或在该 IP 上列出的没有相应 HTTPS 服务器块的域时,Nginx 都会以第一个(作为默认)域进行响应。在这种情况下,我更愿意简单地返回一个标准的 403 Forbidden——我会设置一个默认的服务器块来做到这一点,但我看不到解决客户端证书不匹配警告的方法。
(如何 c|C)我将 Nginx 配置为拒绝对此类未知/未定义域的请求,而无需指定会扰乱浏览器的特定 ssl 证书?(即,我需要 Nginx 在用“坏”证书扰乱客户端之前用 403 拒绝请求 - 从客户端的 POV 这应该与根本没有定义 HTTPS 服务器块的情况相同。)
小智 9
这个问题和我昨天回答的问题很相似:nginx and SNI: is possible to automatically resolve SSL certificate by domain name
在用户在浏览器中看到错误的证书消息之前,不可能拒绝连接。到 Nginx 可能返回 HTTP 403 答案时,SSL 握手已经结束,要完成握手,浏览器必须接受提供的证书。您只能通过设置默认服务器在用户接受证书后拒绝连接:
server {
listen 433 default_server ssl;
ssl_certificate common.crt;
ssl_certificate_key common.key;
return 403;
}
Run Code Online (Sandbox Code Playgroud)
但是,最近的浏览器支持服务器名称指示,如果您为每个虚拟主机设置了证书,普通用户就不太可能看到该消息。
在没有 SSL 指示的有效主机名的情况下,使用 iptables 可能会拒绝连接,但这可能非常棘手,并且根本不符合任何标准。
更新信息:可以return 444在显示证书错误之前立即中止 tcp 连接。