我将所有主机明确设置为绑定到同一个 IP。显然这很糟糕。我也没有打开 SNI。
因此,IIS 颁发了错误的证书。 def.com
正在获取证书abc.com
。可能是因为我首先将其直接绑定到 IP。
netsh show sslcert
IP:port : 123.123.123.123:443
Certificate Hash : <HashA>
//...
IP:port : abc.com:443
Certificate Hash : <HashA>
//...
IP:port : def.com:443
Certificate Hash : <HashB>
//...
这可能很简单,但是我还太年轻。
$ curl abc.com
200
test
$ curl def.com
curl refused. Certificate is for abc.com
答案1
如果您没有启用 SNI,HTTP 服务器会查看Host:
HTTP 标头来确定该连接针对的是哪个虚拟主机。
abc.com
如果您通过 HTTPS 连接,服务器将无法看到该标头:它需要先解密请求,但在解密之前,服务器必须识别自己,并且在这种情况下,它别无选择,只能猜测默认主机名。
这是一个无法逃避的问题,启用 SNI 就是解决方案。
答案2
我已经弄清楚了问题所在,虽然这很愚蠢,但我对于 IP 绑定的看法绝对是 100% 正确的。
同一服务器上的其他网站也有人直接将 IP 地址绑定到该地址。纠正这些问题后,系统netsh show sslcert
突然不再显示与证书绑定的 IP 地址,我马上就知道这招管用了,结果确实管用。
确保所有共享 IP 的 SSL 站点都启用 SNI 也非常重要。
感谢大家。