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


7

我有一个使用SNI从单个IP服务多个HTTPS域的Nginx实例。

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

(c | C)如何配置Nginx拒绝对未知/未定义域的请求,而无需指定特定的SSL证书,这会使浏览器不满意?(即,我需要Nginx拒绝使用403的请求,然后再使用“不良”证书来打乱客户端-从客户端的POV来看,这与根本没有定义HTTPS服务器块的情况相同)。

Answers:


7

这个问题与我昨天回答的问题非常相似: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连接。


使用SNI,理论上您可以在没有给定域名证书的情况下中止连接,这比显示证书错误还要好。你知道怎么做吗?
Yogu 2014年

是的,我发现可以return 444在显示证书错误之前中止tcp连接。
xblax 2014年

@xblax您还可以告诉我们如何在显示证书之前返回444吗?理想情况下,我不会在握手中浪费资源以请求我不知道的server_name。SNI甚至应在解密请求之前显示请求的名称。
静态风暴

0

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


克里斯,你好 我很感谢通配符,但这并不是我要问的。是的,浏览器不会像任何证书BUT一样,有什么方法可以根据请求的服务器名称拒绝连接吗?(我怀疑不是,但这似乎是要问的地方... :)
卡尔顿·吉布森

未经测试的假设->您需要提供有效的证书,否则浏览器将认为连接不安全。因此,在用户允许替代之前,浏览器将不会对您发送的任何重定向进行操作。我能想到的自动执行覆盖的唯一方法是提供有效的证书。:-(
克里斯·纳瓦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.