我想让设置新的子域名变得简单(至少对于开发方面而言),并获取一个通配符证书,设置一个通配符 DNS(已经完成并且效果很好)并设置 SNI(服务器名称指示),这似乎对我们的 HTTPS 测试有用,但在谷歌上搜索后我没有找到任何好的说明。这可能吗?我读过的有关 SNI 的所有内容都说您需要为每个站点设置一个证书,并且 SNI 只是可以根据主机名提供不同的证书。
答案1
如果您有通配符证书,您可以像没有 SSL 一样进行基于命名的虚拟托管。
在协商 SSL 连接时,您的 Web 服务器需要在收到任何 http 协议标头之前选择证书 - 这意味着,如果没有 SNI,Apache 就无法在多个基于名称的虚拟主机之间进行选择。这就是为什么过去您需要为系统上托管的每个虚拟主机分配一个单独的 IP 地址。使用 SNI,客户端能够向服务器提供它希望连接的主机的名称。这允许服务器选择适当的虚拟主机配置,从而选择适当的证书。
如果您使用通配符证书,只要您的所有虚拟主机共享一个共同的父域,您就可以避免这个问题。在这种情况下,SNI 是不必要的。因为证书有效期为任何您的主机,没有要求您的 Web 服务器能够在 SSL 协商开始时识别适当的虚拟主机……这意味着您可以使用 HTTP 标头来识别主机,并继续进行正常的基于名称的虚拟托管。
使用 Apache,您的配置将如下所示:
NameVirtualHost *:443
<VirtualHost *:443>
ServerName foo.example.com
DocumentRoot /sites/foo.example.com/html
SSLEngine On
# ...other SSL parameters...
</VirtualHost>
<VirtualHost *:443>
ServerName bar.example.com
DocumentRoot /sites/bar.example.com/html
SSLEngine On
# ...other SSL parameters...
</VirtualHost>
几年来,我们在生产环境中一直运行这种配置,没有出现问题。