我使用 nginx 作为多个域(假设有 100 个)的 SSL 终止 TCP 端点。
没有必要以不同的方式对待传入连接(它们都被代理到同一个后端),但是对于每个(支持的)域,nginx 应该向客户端提供有效的证书(有效特别意味着这里为客户端的域颁发和签名)尝试连接(如果域是 100 个支持的域的一部分))。
我首先尝试的是使用一个server{}
-section 并指定 a ssl_certificate
,该部分通过 x509“替代主题名称”扩展发布到所有受支持的域。因此,不涉及 SNI。
然而,这有以下缺点:a) 替代主题的数量有限 b) 泄露了所有受支持域的列表
所以我想我必须使用 SNI 并认为我可能只是将所有证书(每个域一个)连接到一个文件中,然后通过ssl_certificate
(显然与各自的私钥相同)和 nginx 引用 - 通过一些 SNI 魔法 -可能会从客户端作为服务器名称发送的内容中选择提供的正确证书。但它不会选择文件中的第一个。
指定ssl_certificate
/ssl_certificate_key
似乎支持算法/类型证书(RSA、EC 等)
我当前看到的最后一个选项:server{}
为每个受支持的域和各自的域特定ssl_certificate
/ssl_certificate_key
选项设置一个部分。
对于 100 个受支持的域,这意味着 100 个server{}
部分,每个部分看起来都相同,只是为ssl_certificate
.
有没有更好的方法“只是”终止 TCP-SSL 连接,然后将它们传递到相同的下一跳,其中唯一的区别是 TLS 证书及其耦合的私钥?
编辑:ssl_certificate
不知何故,我错过了可以在分配给/ 的值中使用变量ssl_certificate_key
,例如:
ssl_certificate $ssl_server_name.crt;
ssl_certificate_key $ssl_server_name.key;
然而,这也有一些缺点:a)每次连接尝试都会导致文件系统查找,如果成功,则加载证书b)(UNIX-)用户nginx在(例如www-data)下运行需要对证书和密钥文件的读取权限,因为它们现在是按需加载和读取的,而静态定义时,nginx 在删除权限之前加载它们。