禁用默认 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 虚拟主机之间共享 SSL 配置