如何在微服务之间实现TLS

17

请有人评论、审核、批评或检查一下我正在考虑的微服务安全设计中是否存在漏洞?

假设我有三个微服务,它们通过REST端点相互通信。每个微服务都包含一个密钥库,其中包含了该微服务的公钥/私钥对,由受信任的证书颁发机构签名。密钥库还包含了其他两个微服务的公钥证书,从源微服务的已签名/可信密钥对中导出。

这种实现方式是有效的,但还是有些不太对劲。

换句话说,每次我引入一个新的微服务时,我必须向其密钥库中添加a)每个现有微服务的公钥证书,并且b)将新微服务的公钥证书添加到每个其他微服务中(假设新微服务必须与每个现有微服务进行双向和安全通信)。

现在,重复上述模式以获取第二个密钥对,用于在REST调用中提供的认证令牌的签名/验证。

我想知道,是否可以共享一个受信任的公钥证书来代替上述操作?这样做是否明智和安全?还是有完全不同的方法?

请礼貌地回答,我在这个领域绝不是专家。

编辑:

在阅读我的原始帖子的回复/评论后,我想到了一个我忽略的细节,这可能会使问题更清晰,从而使评论者能够更好地解决它:

  1. 所涉及的微服务存在于私有内部网络中,并且只能由该内部网络中的客户端(浏览器或其他微服务)访问。

  2. 实际上有一个受信任的CA - 即拥有此内部网络的公司,并且正是该CA签署了微服务的密钥对。

看起来,这个问题的解决方案已经在@Andreas的第一条评论中暗示了,在那里他写道,“只要发行它们的CA是受信任的,它们也将受到信任。”

只要每个新的微服务都使用a)由CA签署的自己的密钥对(一个用于签名,另一个用于加密),并且b)CA的证书进行部署,我便可以放心地部署新的微服务,以确保它们与所有其他微服务安全通信(有其他潜在漏洞我甚至不知道)。

我不知道怎么会误以为我需要为每个微服务的密钥对创建全新的证书,并将这些证书包括在其他微服务的密钥库中(对于每个新微服务重复)。实际上,我所需的只是一个证书,即签署密钥对的CA的证书,位于每个微服务的密钥库中。


1
为什么您需要添加每个服务的公共证书?只要颁发它们的CA受信任,它们也会受到信任。这就是网络本身的工作原理,那么为什么这对您不起作用呢? - Andreas
感谢您使用TLS而不是其他人常犯的错误,但请从标签中删除它。还有Java和TLS1.2,因为您的问题与这些情况无关。 - Patrick Mevzek
@Andreas,当您需要对客户端进行身份验证时,这并不起作用(在验证服务器方面很容易)。服务器需要预先知道有关证书的一些信息,或者使用私有PKI,否则任何人都可以提供由任何CA签名的任何证书。 - Patrick Mevzek
1
如果可以的话,可以依赖基础设施提供安全通信。例如,如果您使用Docker Swarm,则可以为网络激活连接加密:https://docs.docker.com/network/overlay/#encrypt-traffic-on-an-overlay-network - Constantin Galbenu
1
@ConstantinGalbenu 加密不等同于双向认证。 - Marged
2个回答

9
一种实现方式(您的问题很广泛,如果没有代码,可能更适合在SoftwareEngineering上讨论)是:
  1. 创建您自己的 CA
  2. (可选)仅为您的微服务创建子CA
  3. 由此 CA 生成所有证书
  4. 使您的代码信任来自此 CA 的所有证书,而不是检查证书本身(但您仍应检查日期、正确签名等)。
这样,当您引入新的微服务时,只需生成一个证书即可,在其他微服务中无需更改任何内容,这是必须达成的目标,否则它将无法管理。
通过这样做,您甚至可以将一些微服务移出系统,根据需要进行部署。它们只需要与 CA 公钥一起发送。
我建议不要为不同的微服务重用相同的证书,因为这只会导致问题。
另外,虽然与本文主题略有关联,但请务必阅读以下内容:https://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf 它展示了在 web 之外使用 TLS 时的各种 pitfalls。它是开眼界的。虽然只针对 TLS,并非 PKI 问题,但这份 Internet-Draft(https://datatracker.ietf.org/doc/draft-gutmann-tls-lts/)可以提供有关如何使用某些安全默认项正确实现 TLS1.2 的有用见解。LTS 部分特别指“长期支持”。
还要查看这个相关问题:https://security.stackexchange.com/questions/175627/securing-internal-micro-services-letsencrypt-vs-self-signed-certificates-be,其中的答案会为您提供其他想法,例如使用 vault。

哇,谢谢你提供这个好链接。迫不及待想要阅读它。我相信它会完全颠覆我的方法。你说得对:在Web之外使用TLS是我感到有些困惑的地方。 - divaconhamdip

3
如果您的微服务没有暴露在互联网上,那么可以创建自签名证书以此为目的。自签名证书用于内部调用。您可以在sslshopper网站上创建它们。
另外,请勿为所有微服务使用相同的证书。我已经实现了类似的解决方案,在我们的情况下,我们设置了签名服务作为另一个微服务,它将为其他微服务提供服务。这个自签名服务将连接到HSM或硬件安全模块。所有证书都存储在属于配置文件的HSM中。您可以在HSM和配置文件创建方面进行一些谷歌搜索。
信任存储用于保留公共证书,而密钥存储用于存储私钥。这是标准做法,虽然不是普遍适用但是在理想情况下会这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接