大型系统中的证书管理
大型系统中的证书管理#
随着安全的要求,现在我们在越来越多的通信中使用TLS加密。下图是一个微服务架构下数据流向的例子
- 蓝色部分,即和三方交互时需要TLS加密认证
- 红色部分,各个微服务、消息中间件等通信需要TLS加密认证
- 绿色部分,各个微服务和存储层通信也需要TLS加密认证
安全上对我们的要求逐步变化为,仅蓝色使用TLS=》蓝色和红色使用TLS=》全部使用TLS加密
证书管理的必要性#
从安全的角度上来说,我们最好能支持证书的更换和热加载。如果您的业务当前使用加密的场景不多,可能暂时看不到证书管理的意义。但是当你在各个方面使用TLS更加频繁之后,会发现证书管理可带来如下好处:
- 可以通过抽象出场景,通过场景和证书的关联联系,在各个地方通信使用的证书,可以统一更换。
- 统一提供证书过期告警等功能
- 统一提供证书的变更通知,通知到各个实例
以我在工作中接触到的两个基础PAAS平台,都有证书管理的功能,可见证书管理的必要性。
PS: 开源组件大多都拥有证书配置能力,没有可对接证书管理的能力,但这个能力很难贡献给社区,需要自己开发。
证书管理概念#
在TLS会话中,从依赖的证书文件角度来看,可以分为加密流程和验证流程。
加密证书#
TLS加密流程的证书,包含证书链文件和密钥
验证证书#
TLS验证流程的证书,仅包含证书链文件
拆分为加密流程和验证流程的合理性#
这使得加密流程证书和验证流程证书可以互相独立的替换,更方便在大型场景下复用证书。
让我们来假设如下的场景:
客户A、客户B、客户C、客户D的验证流程证书自然不相同,但服务跟客户交互的时候,使用的加密流程证书确实同一份。如果将两个阶段的证书合一,那么在更换证书的时候,就需要更新4份数据,当你有1000名用户的时候,这个数字将会是1000,这对于存储和应用程序来说都是不小的冲击。
Scene#
Scene是在一个会话中,代表会话和请求证书、验证证书的绑定关系。Scene和请求证书、验证证书都是1:1的关系。这使得我们不仅仅可以修改证书文件,也可以对TLS会话中使用的证书进行修改。在证书无法复用,且证书绑定了多个场景的时候,针对单个场景修改其绑定的证书。
以上图作为例子,假设客户D有特殊的要求,要求加密流程使用特定的证书或密钥,我们就可以将客户D的场景绑定到客户D独有的加密证书
多集群管理#
如果证书管理需要管理多个集群,那么证书和Scene前面可以加上层级来隔离,如环境、集群等。
对小型系统的建议#
如果规模不大,且TLS场景有限,需要考虑一下有无拆分加密证书和验证证书的必要,可以合一,应用程序直接以合一的证书id来关联,而非场景id。虽不方便复用,但大大降低了复杂性。
证书管理的功能#
证书管理场景#
设定一个TLS会话#
使用TLS会话#
这要求应用程序持久化场景信息
组织架构相关#
大型系统下,证书管理是一个必须的组件,且一定是由团队最底层的组织架构承接。如若不然,那么由底层组织架构维护的组件,因为依赖关系,无法基于证书管理来统一实现证书的更换和过期告警。除非不基于证书管理自己构筑一套能力。
TLDR#
随着组件和使用加密场景的不断扩大,证书管理是一个必须的组件,通过抽象出场景的概念来复用证书,通过变更通知在微服务模式下快速更换所有微服务实例上的证书,并提供统一的证书过期告警功能来提醒管理员更换证书。