我有两个域名,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证书甚至没有标准化,因此允许这种请求是没有意义的。
答案 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握手将失败。