禁用默认443虚拟主机的Apache SSL引擎

时间:2017-09-09 09:51:41

标签: apache ssl virtualhost tls1.2 mod-ssl

我有两个域名,example1.com和example2.com,在同一个IP上运行,12.345.678.90。

现在我希望通过12.345.678.90完全拒绝https访问。

我试图这样做(紧凑的代码没有花哨的东西)

<VirtualHost *:443>
    SSLEngine off
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    ServerName example1.com
    DocumentRoot /var/www/html/example1
    SSLCertificateFile /etc/.../fullchain.pem
    SSLCertificateKeyFile /etc/.../privkey.pem
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on
    ServerName example2.com
    DocumentRoot /var/www/html/example2
    SSLCertificateFile /etc/.../fullchain.pem
    SSLCertificateKeyFile /etc/.../privkey.pem
</VirtualHost>

现在,当我禁用默认捕获所有的第一个块时,这两个示例站点工作。但是,如果我启用它,则不再有效。实际上,这只是为443复制的端口80解决方案。它似乎是SSL特定问题(编码请求数据)。

如何通过https阻止“IP访问”?或者,配置我的设置的常用方法是什么?

背景是:创建基于IP的SSL证书甚至没有标准化,因此允许这种请求是没有意义的。

1 个答案:

答案 0 :(得分:2)

  

创建基于IP的SSL证书甚至没有标准化,

这不是真的。该标准明确定义了特定IP地址的证书应使用主题备用名称部分中的iPAddress类型。但公共CA将不再为IP地址颁发证书,而只为主机名颁发证书。

除此之外,您的服务器要么接受特定IP地址上的SSL端口上的连接,要么不接受。这是因为在TCP级别只能看到IP地址,并且不知道主机名。如果客户端使用所有现代浏览器都执行的SNI TLS扩展,则主机名只能在TLS握手内部获知。

因此,如果客户端在SNI扩展中使用未知主机名或根本不使用SNI扩展名,即使用https://ip-address/,则您可以做的最多是使TLS握手失败。这可以通过使用SSLStrictSNIVHostCheck指令as documented

来完成
  

如果在默认的基于名称的虚拟主机中设置为on,则不允许不知道SNI的客户端访问属于此特定IP /端口组合的任何虚拟主机。

使用此选项设置对http://ip-address/的访问权限将导致客户端发出TLS警报,并且TLS握手将失败。