【问题标题】:is there a way to disallow https connections to certain subdomains that do not have a certificated while using SNI有没有办法在使用 SNI 时禁止与某些没有证书的子域的 https 连接
【发布时间】:2015-02-23 18:10:01
【问题描述】:

目前我使用 nginx 作为我的网络服务器。前段时间我发现了服务器名称指示 (SNI),它非常有用,因为我的服务器上有几个域(包括所有子域)。

我就这样退出了,我在我的主域上放了一个 ssl 证书,在我的服务器上放了几个子域。效果很好,没问题:D

(我不只是使用通配符证书的原因是因为我使用的是http://www.startssl.com/,它为我提供了免费的 ssl 证书,但是对于通配符我必须付费,而且我的服务器并不那么重要为此,这只是一个爱好项目)

那么问题来了: 如果有人浏览到一个不存在的(子)域,或者没有安装证书的域,他们当然会在浏览器中收到一个很大的警告,因为 nginx 提供了默认证书,该证书当然与那个不存在的证书不匹配领域。 我想知道,如果 sni 系统被要求提供一个不存在的域名,是否可以告诉 nginx,只是终止连接或者可能做一些事情,而不是名称不匹配警告,会出现一些其他警告在浏览器中说该站点不存在(如果确实存在这样的系统......)

我知道一个解决方案:去掉通配符-dns-record,这样不存在的确实不存在,但这对存在的那些没有帮助,但在 https 上却没有。此外,我不能轻易地添加一个新的子域,并且还必须为其编辑 dns 设置。 (我知道,我很懒,但哪个书呆子不是:P)

哦,如果这样的事情是不可能的,我将不得不接受现在的方式,没什么大不了的,但它会让我的服务器不那么“酷”xd(对不起,我只是一个随机的技术爱好者)。

【问题讨论】:

  • 我建议改为在 ServerFault 上询问这个问题,但不要提及任何业余爱好者,因为它是针对专业背景的。

标签: ssl nginx https ssl-certificate sni


【解决方案1】:

只是不要对子域使用 SSL :) 例如

server {
    listen 80;
    listen 443;
    server_name example.com;
    ...
}
server {
    listen 80;
    server_name *.example.com;
    ...
}

【讨论】:

  • 对于每个没有 ssl 证书的子域,那里已经没有 listen 443。事实证明,如果您确实在此类子域上进行了 https 连接,nginx 只会提供它可以找到的第一个 ssl-(sub) 域名。因此,虽然这不是完全解决方案,但我确实设法让我以正确的方式思考并找到解决方案!我会自己添加它作为答案
【解决方案2】:

事实证明,SuddenHead 的答案几乎是解决方案。它只需要一点点额外的步骤。我已经完成了 SuddenHead 所说的操作,但是如果您要访问一个不存在的子域,或者一个没有 ssl 的子域,它只会为它可以找到的第一个启用 ssl 的子域提供服务。解决方案非常简单。确保将服务器块添加到 nginx-config 并确保它是 first 一个 nginx 将读取:

server {
    listen 80 default_server;
    listen 443 default_server;

    return 404;
}

这还将为任何不存在的子域提供 404 页(我也想要的东西,如果不需要,我认为省略 listen 80 规则应该可以)并且因为没有指定 ssl 证书详细信息,所以访问这个在 https 上给出了一个关于无法建立的 ssl 连接的错误,而不是一个域不匹配错误,并带有关于某些事情可能是错误的警告的警告。这基本上正是我想要的:D

现在我确信有更多“更好”的方法可以做到这一点,但这可以满足我的一切需求。

编辑:我把default_server 放在listen 指令中,这当然会破坏一切,因为默认情况下ssl 会被破坏......哎呀。所以恐怕我没有想到这个想法,毕竟这不是解决方案:(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 2010-11-17
    • 2011-09-12
    • 2020-11-22
    相关资源
    最近更新 更多