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

Disable Apache SSL engine for default 443 Virtual Host

我有两个域,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 access"?或者,配置我的设置的常用方法是什么?

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

It is not even standardized to create IP-based SSL-certificates,

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

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

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

来完成

If set to on in the default name-based virtual host, clients that are SNI unaware will not be allowed to access any virtual host, belonging to this particular IP / port combination.

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