设计双向认证 TLS 证书链的最佳实践?

信息安全 证书 证书颁发机构
2021-08-16 23:08:12

我正在寻找有关使用证书构建相互身份验证系统的最佳实践建议。我想创建一个系统,其中包含多个 IoT 设备向 Web 服务器报告数据,其中服务器和客户端都需要相互验证。我正在考虑使用一个根证书颁发机构(个人证书颁发机构)和一个中间证书颁发机构用于服务器证书,另一个用于客户端证书。

根 CA 签署中间 CA (x2),一个签署服务器证书,一个签署客户端证书。

将来根 CA 可能会签署另一个中间 CA。

这有意义吗?还是为服务器和客户端实现单独的根 CA 更好?

由于我要使用自签名证书,为了让一方验证另一方,我是否必须向所有人提供根证书?还是中级证书?如果其中一台设备遭到入侵,会发生什么?(撤销?)

很抱歉有多个问题,但后续问题与主要问题有关。证书链应该如何设计?哪种方法更安全?

2个回答

我不知道进行客户端身份验证是否有一套“最佳实践”,因为它在很大程度上取决于您的环境细节。如果足够接近,您可能会找到为 VPN 客户端身份验证设置 CA 的最佳实践。

我可以给你一个问题列表,你应该在你的应用程序的上下文中考虑这些问题。在解决这些问题时,关于 CA 层次结构的问题可能会为您解决。

  • 客户端和服务器有什么区别吗?如果有人可以使用客户端证书设置假服务器并让其他客户端连接到它,那将是很糟糕的。有很多方法可以解决这个问题:您可以为客户端和服务器使用不同的根 CA,尽管将“我是客户端”和“我是服务器”扩展密钥用法放入证书可能更简单。请注意,更聪明的方法将要求您在客户端和/或服务器组件上编写自定义证书验证代码。

  • 撤销如何运作?如果客户端/服务器需要撤销他们的证书,他们联系谁?服务器/客户端如何知道它已被撤销?服务器/客户端多久会知道它已被撤销?

  • 当客户端证书过期时,您如何更新它们?(不要拉特斯拉,这里有完整的推特线程

  • 您如何保护 CA 的私钥?它们是否存储在某种硬件令牌上?如果托管 CA 的机器出现故障会发生什么?(暂时阻止撤销信息的发布,或永久丢失 CA 私钥)

基本上,我认为您如何设置 CA 层次结构最终会成为您如何解决其他安全考虑的副作用;)

我将部署简单的 2 层层次结构,具有单个根和单个颁发 CA,它将向客户端和服务器颁发证书。除非没有特定要求,否则不需要部署多个根甚至中间 CA。保持简单的2层。

我必须向所有人提供根证书吗?

是的。客户端必须信任您的根才能对服务器进行身份验证。服务器必须信任您的根才能对客户端进行身份验证。

如果其中一台设备遭到入侵,会发生什么?(撤销?)

是的。但是,撤销可能有很大的延迟。因此,有一个本地数据库来记录所有客户及其基本信息可能是合理的。如果设备受到威胁,请更新数据库(禁用设备帐户)以暂时阻止设备连接到服务器,直到问题得到解决。