我有同样的情况描述这个问题。我有一个客户端连接到具有多个后端服务的 nginx 反向代理,需要设置证书。
client
|
nginx
https://example1.com
https://example2.com
https://example3.com
x.x.x.x
|
-----------------------------------------
| | |
https://example1.com https://example2.com https://example3.com
a.b.c.d:1234 e.f.g.h:5678 i.j.k.l:9012
但是,从那里的答案中我不清楚的是每个证书中列出的 DNS 名称和 IP 应该是什么。
我的理解:
- 反向代理不会终止 TLS 连接,因此客户端永远不会看到代理的证书
- 编辑:我意识到反向代理可以终止 TLS 连接,但就我而言,我需要它通过
- 代理的证书应该列出后端服务示例 1、2 和 3 将看到的主机名/IP 地址。仅有的后端服务将看到这些证书
如果上述两点属实,那么后端服务的证书中应该列出哪些 DNS 名称和 IP?客户端需要在证书中看到代理的主机名/IP,对吗?但代理应该看到他们的真实 IP?
这就是我感到困惑的地方。
答案1
解决方法之一是终止 Nginx 上的 HTTPS 流量,然后传递到example1
、example2
和example3
。在这种情况下,客户端会验证从 Nginx 获得的证书,因此当您连接到 时https://example1.com
,它将检查 是否CN=example1.com
匹配以及它是否有效并由受信任的 CA 签名。客户端将看到 Nginx 和 Nginx 传递到的服务之间是如何进行此检查的。
问题是,此示例包含客户端应连接的完全相同的监听地址和流量应代理到的地址。这应该是不同的,因此,例如,当连接到时https://example1.com
,此流量应转发到https://example1-something.com
(以避免循环)。
Nginx 可以验证代理服务的证书,这里这是 serverfault 的另一个问题。您也可以忽略证书,但如何处理完全取决于您。从客户端的角度来看,重要的是它连接到具有有效、受信任证书的服务器,而这超出了给定的范围。
我自己从来没有这样做过,但技术上你可以尝试做一个TCP 代理而不是 HTTP 代理,然后您必须终止代理机器上的证书,但我认为这个想法有点像样板文件,第一种方法更容易实现。