![nginx 和 SNI:是否可以通过域名自动解析 SSL 证书](https://linux22.com/image/626675/nginx%20%E5%92%8C%20SNI%EF%BC%9A%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87%E5%9F%9F%E5%90%8D%E8%87%AA%E5%8A%A8%E8%A7%A3%E6%9E%90%20SSL%20%E8%AF%81%E4%B9%A6.png)
我需要设置一个服务器,该服务器将使用不同的域名通过 SSL 提供相同的内容。问题是我需要能够尽可能轻松地添加新域名。假设所有域名都已配置到我的服务器,我猜是否可以以某种方式设置 nginx(或者可能是另一个反向代理),以便它将监听对特定 IP 的所有请求,并在获取 HTTPS 请求后尝试在某个文件夹或数据库中查找用于发出此请求的域的证书,如果找到证书则处理该请求(这样我们就可以建立安全连接),如果未找到证书则拒绝连接。
我不确定这是否可能,或者也许我正在考虑一些鲁莽的事情,但由于我无法在网上找到任何信息,所以我决定在这里询问。
据我了解,最简单的解决方案是为每个应该支持的域添加单独的配置。
答案1
我猜除了为每个虚拟主机创建单独的配置之外没有其他解决方案。使用模板应该很简单。
但是,有些浏览器尚不支持 SNI(所有最新浏览器都支持)。这些浏览器可能会显示证书无效的消息。
如果您想拒绝某些没有证书的虚拟主机的连接,您只需不在这些虚拟主机上启用 SSL 即可。添加一个默认服务器,该服务器捕获 SSL 端口上未知虚拟主机的所有连接并返回错误(403 forbiden 或非标准 444 用于 tcp 重置):
server {
listen 433 default_server ssl;
ssl_certificate common.crt;
ssl_certificate_key common.key;
return 403;
}
您无法阻止没有 SSL 的 vhost 上出现无效证书消息,因为无法使用 nginx 在 SSL 握手之前取消 TCP 连接。您可以尝试使用 iptables 来拒绝非 sni SSL 握手,但这可能有点难以正确配置,并且可能需要了解一些 SSL 规范。