我在一台服务器上为两个不同的域设置了 2 个 SSL。我通过将 SSL 编号 2 指向另一个端口号(在本例中为 444)来实现这一点。以下是 Apache 的代码:
<VirtualHost XX.XX.XX.XX:443>
ServerAlias *.xxxx.com
ServerName xxxx.com
SSLEngine on
SSLCertificateFile /usr/local/ssh/xxx/xxx.crt
SSLCertificateKeyFile /usr/local/ssh/xxxx/xxxx.key
DocumentRoot /var/www/www.xxxxx.com/web/
</VirtualHost>
Listen 444
NameVirtualHost *:444
<VirtualHost xx.xx.xx.xx:444>
ServerAlias *.yyyyyy.com
ServerName yyyyyy.com
SSLEngine on
SSLCertificateFile /usr/bin/yyyyy.com.crt
SSLCertificateKeyFile /usr/bin/yyyy.key
SSLCertificateChainFile /usr/bin/yyyyy.crt
DocumentRoot /var/www/www.yyyyyy.com/web/
</VirtualHost>
目前,我的所有链接都指向https://yyyyy.com:444/因此用户看不到任何无效的 SSL 证书。问题是我有一些用户只是输入https://yyyyy.com/并且不要输入端口号,而且他们也不应该这样做。
如果我去的话,https://yyyyy.com/它正在查看 xxxx.com 的证书,并弹出无效的 SSL 证书错误。我尝试了几个 mod 重写,如果 yyyyy.com 在端口 443 上,则重定向到https://yyyyy.com:444/
我确信答案是显而易见的...但是就我的生活而言,我就是无法弄清楚!
答案1
除非您拥有一个共同顶级域名的两个子域名,并且获得了通配符证书,否则这是不可能的。
之所以不可能,是因为当客户输入https://yyyyy.com/
(注意,不是:444)时,他们的浏览器会启动与监听端口 443 的进程的 TLS 连接。通过此端口,证书和握手信息(包括主机名)默认绑定到该 ip:port 组合的 vhost 进行交换。
只有在建立 TLS 连接后,您才能交换 HTTP 级别 301 重定向。但此时客户已经看到了 的无效证书信息https://xxxx.com
。
另外,我注意到您正在将 别名www.xxxx.com
为与 相同的虚拟主机xxxx.com
,这将产生相同的效果。您的证书(除非它是通配符)仅适用于xxxx.com
或www.xxxx.com
。
答案2
答案3
Antoine Benkemoun,以前你不能使用基于名称的虚拟主机进行多个 SSL,但使用单独的端口可以绕过这个限制。
如果不使用,你仍然不能加密传输协议
我要在这里猜测,但我怀疑您没有将 GnuTLS 用于您的 Web 服务器 ssl 库,因此您所要求的是基于名称的 vhosting 和 SSL,并且不起作用。
答案4
使用 SSL,一个 IP = 一个证书。如果您需要多个证书,请获取一个额外的 IP。例外情况是为多个子域签名的多域证书。