所以我有一台只有一个 IP 的服务器,上面有很多网站,全部托管在 nginx 下。下面是非常简化我的实际设置:
server {
listen 80;
listen 443 ssl;
server_name ssl.example.com;
#...
}
server {
listen 80;
server_name nossl.example.com;
#...
}
如果我连接到 ,ssl.example.com:443
一切正常,如预期。
如果我连接到nossl.example.com:443
,它会尝试提供 的内容ssl.example.com:443
。
我已经和解了为什么会发生这种情况(这只是 ssl+nginx 与虚拟服务器的最佳匹配方式),我只需要阻止它从错误的站点发送内容。
除了为我的所有网站购买证书(或颁发自己的证书)或将 SSL 网站推送到自己的 IP 之外,我还有什么选择?nginx 能否对每个 SSL 请求的域进行双重检查并确保其匹配server_name
?
答案1
添加以下虚拟服务器:
server {
listen 443 ssl;
server_name _;
ssl on;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/certificate.key;
return 444;
}
如果没有匹配的主机,Nginx 将使用此主机作为最后的手段并返回错误。
它需要 SSL 证书才能工作,但您可以非常快速地生成一个自签名证书,这样就可以了。这比为另一个域共享有效的现有证书(这无论如何都会引发错误)要好,因为泄漏更少。
答案2
我倾向于认为#2是最正确的答案,但我发现当放置在非ssl虚拟服务器的服务器块之上时,以下内容也能正常工作。
server {
listen 443;
server_name .example.com;
return 444;
}
不要使用“ssl”标志。