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

Posted

技术标签:

【中文标题】禁用默认 443 虚拟主机的 Apache SSL 引擎【英文标题】:Disable Apache SSL engine for default 443 Virtual Host 【发布时间】:2018-02-18 03:21:43 【问题描述】:

我有两个域,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】:

创建基于 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 握手将失败。

【讨论】:

以上是关于禁用默认 443 虚拟主机的 Apache SSL 引擎的主要内容,如果未能解决你的问题,请参考以下文章

aiohttp.client_exceptions.ClientConnectorError:无法连接到主机***.com:443 ssl:默认[连接调用失败('151.101.193.69',443

Apache:在服务器名称不匹配时禁用重定向到默认虚拟主机

apache实现多域名虚拟主机的SSL认证

在服务于不同域的 apache 虚拟主机之间共享 SSL 配置

我配置好一个tomcat,ssl证书,如何给同一台机器上的其他tomcat配置证书,默认的80,443端口已经被占用。

Apache 443端口占用解决方法