我正在研究一个客户端架构,我们计划将我们的客户端固定在我们的服务器上。我的服务器叶证书在我们的产品生命周期中可能会发生变化,这就是为什么我们需要一种刷新机制来支持具有嵌入式证书的较早发布的客户端。
这是我计划的两种方法:
计划使用一组备用公钥/私钥对,私钥保存在 HSM 中。公钥嵌入在客户端中。
方法1:
在叶子到期时
颁发可以在公共 Internet 上下载的叶证书 pinset。
在客户端上,下载这个带有固定根证书的叶子 pinset。
如果下载成功,请使用这个新的叶子 pinset 并将其固定用于所有后续 HTTP 调用。
如果 Leaf + Root 过期
如果由于某种原因,root 也过期了,或者 root 已更改为新的提供程序。
在客户端,下载带有根证书的叶子 pinset -> 由于根过期而失败。
刷新root,下载由备份私钥签名的新root pinset。这是一个未固定的呼叫。
下载后使用客户端嵌入的备份公钥验证签名。
如果成功,请使用此根 pinset,将其固定以下载叶子。使用下载的叶子并将其固定以进行后续的 http 调用。
方法2:
使上述方法更加精简,并完全避免根针集。
使用备份私钥对叶子 pinset 进行签名,并保留可以在公共 Internet 上下载的 pinset。
在客户端刷新下载时,使用未固定调用下载。
下载成功后,使用备份 pub key 进行验证,并将其用于所有 http 调用。
我对上述 2 种方法的问题是,方法 2是否为安全漏洞留下任何空间,总体而言,我觉得必须在客户端处理较少数量的人工制品是可行的方法,但我不想以任何方式损害安全性。