如何在微服务之间实现TLS

div*_*dip 7 ssl pki microservices

有人可以对我正在考虑的微服务安全设计发表评论,审核,评论或其他方面的评论吗?

假设我有三个微服务,每个微服务通过REST端点与另外两个微服务进行通信.每个微服务都包含一个密钥库.在此密钥库中包含由受信任的证书颁发机构签名的微服务的私有/公共密钥对.此密钥库中还有另外两个微服务的公钥证书,这些证书是从源微服务的签名/可信密钥对导出的.

这种实现方式有效,但有些事情并不十分正确.

也就是说,每次我引入一个新的微服务时,我必须将每个现有微服务的公钥证书添加到其密钥库,以及b)新微服务的公钥证书到其他所有微服务(假设新的微服务必须双向通信,并且安全地,与每个现有的微服务).

现在,为第二个密钥对重复上述模式,这个密钥对用于签署/验证REST调用中提供的身份验证令牌.

我想知道,除了上述之外,是否a)建议并且b)在所有微服务之间共享一个可信的公钥证书是否安全?完全不同的东西?

请礼貌.我绝不是这方面的专家.

编辑: 在我阅读原帖后的回复/评论之后,我发现我省略了可能使问题更加清晰的细节,因此评论者能够更好地解决这个问题:

  1. 有问题的微服务存在于专用Intranet内,并且只能由该Intranet内的客户端(浏览器或其他微服务)访问.

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

看来,这个问题的解决方案隐含在@Andreas的第一条评论中,他写道:"只要发布它们的CA受到信任,它们也会受到信任."

只要每个新的微服务都部署有a)自己的密钥对,由CA签署(一个用于签名,另一个用于加密),以及b)CA的证书,我可以部署新的微服务,并且合理保证他们将与所有其他微服务(合理的,因为我甚至不知道其他潜在的漏洞).

不知何故,我想到了我必须为每个微服务的密钥对创建一个全新的证书,并将其包含在其他微服务的密钥库中(重复每个新的微服务).相反,我需要的只是一个证书,即在每个微服务的密钥库中签署密钥对的CA的证书.

Pat*_*zek 5

做到这一点的一种方法(您的问题很广泛,没有代码,在SoftwareEngineering上可能比这里更具话题性)如下:

  1. 创建自己的CA
  2. (可选,仅为您的微服务创建子CA)
  3. 通过此CA生成所有证书
  4. 使您的代码信任该CA的所有证书,而不是检查证书本身(但您仍应检查日期,正确的签名等)

这样,当您引入新的微服务时,您只需为其生成一个证书,而在其他微服务中则无需更改,这是您需要达到的目标,否则将无法对其进行管理。

通过这样做,您甚至可以根据需要将一些微服务移出我们的系统。它们只需要带有CA公钥即可。

我建议不要将同一证书用于不同的微服务,因为这只会导致问题。

另外,虽然松散相关,但是请务必阅读以下内容:https : //www.cs.utexas.edu/~shmat/shmat_ccs12.pdf 它显示了在网络外部使用TLS时的各种陷阱。令人大开眼界。尽管此Internet-Draft(https://datatracker.ietf.org/doc/draft-gutmann-tls-lts/)仅专门针对TLS而非PKI问题,但它可以提供有关如何正确实施TLS1.2的有用见解。带有一些安全的默认选项。“ LTS”部分专门表示“长期支持”。

看看以下相关问题:https : //security.stackexchange.com/questions/175627/securing-internal-micro-services-letsencrypt-vs-self-signed-certificates-be以及给出其他想法的答案,就像使用金库一样。