代理和前端之间应该如何共享证书?

信息安全 tls 证书 代理人
2021-08-29 06:20:52

在工作中,我被要求研究为 WebSocket 聊天应用程序创建参考拓扑,其中包括面向 Web 的前端服务器和后端之间的代理。目前,我仍然在同一台服务器上运行前端和后端进行开发,但我暂时将 WebSockets 设置为指向代理,该代理位于实验室中完全独立的服务器上。两台服务器都在内部网络上,并且每台服务器都有一个单独的自签名证书。

当我通过 TLS 测试 WebSocket 时,由于证书是自签名的(没有显示任何异常对话),直到我直接连接到代理并为证书设置异常,它才失败。在那之后,它工作得非常好,但实际上可能不允许访问者这样做。所以,我需要找出如何同时证明两者。

据我所知,这样做的主要方法是:

  • 将代理和前端放在不同的子域上(例如frontend.domain.comproxy.domain.com),并为站点使用通配符证书。这在实验室中使用起来会更快、更容易,但 IETF不鼓励这样做
  • 使用具有主题备用名称的单个证书,并在www.mydomain.com的 SAN 字段下包括frontend.mydomain.comproxy.mydomain.com据我所知,这与担保流氓/错误域的问题相同。
  • 对两台服务器使用完全独立的证书,就像我已经在做的那样。使用起来更麻烦,尤其是使用自签名证书,但如果一个域受到损害,那只是一个故障点。我的主要问题是,如果代理和前端证书不是自签名的,这更有可能起作用吗?

上面有什么我错过的,还是有其他方法?

编辑 22/07/2015:顺便说一句,在通过相同机制发送 XMLHttpRequest 时,我发现我必须关闭代理和后端之间的证书验证以允许 SSL 握手继续进行,所以我想知道如果我的自签名证书是问题的真正原因。但是,这可能无法解决我上面的问题。

1个回答

如果您有自签名证书,则需要您的客户信任它。

或者,您可以让客户端不检查证书是否受信任,但这是一个糟糕的主意。

你如何做到这一点取决于你的客户。如果你有这样的事情:

[user-agent]---------[frontend]---------[proxy]---------[backend]

用户代理(可能是浏览器)是前端的客户端,前端是代理的客户端,代理是后端的客户端。

这里的每个客户端都需要信任服务器提供的证书,因为它是由已经受信任的实体签名的,或者是因为您将自签名证书添加到了信任库。

所以是的,自签名会给你带来麻烦

如果出于可扩展性原因存在代理,将来会有更多的后端主机。

如果前端背后的所有通信都在您的组织内部,您可以设置自己的内部 CA 并信任其在前端和代理中的根证书。

这样,您可以在内部添加新主机,每个主机都有自己的证书,客户端会自动信任它。

为不同的服务器使用不同的证书通常是一个好主意,这与您是否部署自己的 CA 无关。当密钥被泄露时,您需要撤销该密钥的证书,并且与被泄露的主机共享证书的任何主机也将需要新证书。