让 Nginx 通过 HTTPS 拒绝未知的服务器名称

让 Nginx 通过 HTTPS 拒绝未知的服务器名称

我有一个 Nginx 实例,使用 SNI 从单个 IP 提供多个 HTTPS 域。

该设置的唯一缺陷是,每当请求服务器裸 IP 的 URL 或在该 IP 上列出的没有相应 HTTPS 服务器块的域时,Nginx 都会使用第一个(作为默认)域进行响应。在这种情况下,我更希望简单地返回标准 403 Forbidden——我会设置一个默认服务器块来执行此操作,但我看不出有办法绕过客户端证书不匹配警告。

(如何 c|C) 我可以配置 Nginx 以拒绝对这些未知/未定义域的请求,而无需指定会使浏览器不满意的特定 SSL 证书吗?(即,我需要 Nginx 在使用“坏”证书惹恼客户端之前以 403 拒绝请求 - 从客户端的角度来看,这应该与根本没有定义 HTTPS 服务器块的情况相同。)

答案1

这个问题与我昨天回答的问题非常相似:nginx 和 SNI:是否可以通过域名自动解析 SSL 证书

在用户在浏览器中看到证书错误消息之前,无法拒绝连接。当 Nginx 返回 HTTP 403 答案时,SSL 握手已经结束,要完成握手,浏览器必须接受提供的证书。您只能在用户接受证书后通过设置默认服务器来拒绝连接:

server {
    listen 433 default_server ssl;
    ssl_certificate       common.crt;
    ssl_certificate_key   common.key;
    return 403;
}

但是,大多数最新的浏览器都支持服务器名称指示,如果为每个虚拟主机设置了证书,普通用户就不太可能看到该消息。

可能可以使用 iptables 拒绝 SSL 指示的没有有效主机名的连接,但这可能非常棘手并且根本不符合任何标准。

更新信息:return 444在显示证书错误之前可以立即中止 TCP 连接。

答案2

如果您的域名是同一主域名 (*.example.com) 的子域名,则可以使用通配符证书。否则,我认为您无法提供浏览器满意的任何证书。

相关内容