![使用 openssl 构建 PKI 时出现问题](https://linux22.com/image/1342073/%E4%BD%BF%E7%94%A8%20openssl%20%E6%9E%84%E5%BB%BA%20PKI%20%E6%97%B6%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98.png)
我已经使用设置了一个小型 PKI openssl ca
,具体方法如下指引其中详细解释了该过程和一些概念。我希望实现该文章中概述的三层设置,即实际证书由中间 CA 颁发,而中间 CA 又由根 CA“管理”,根 CA 进行自签名并最终部署到相关客户端。我已尝试尽可能接近地重现文章中的配置,以防止我一次定制太多我还不理解的东西。
到目前为止,我有以下内容:
- 根 CA 的证书和“基础设施”。
- 中级 CA 的证书和“基础设施”。
- 两个 CA 的 CRL。
- 由中级 CA 颁发的测试证书,用于检查所有这些是否正常。
- 用于比较的演示 CA 的副本。
理论上,通过将根 CA 的证书部署到浏览器,然后浏览由最后一个证书保护的网站,我应该得到“挂锁图标”。这做可与 Internet Explorer、Chrome 和 Firefox 配合使用。Opera 出现故障,并显示“安全连接:致命错误 (1578)”,因此显然存在问题。
论坛上的一篇文章指出问题出在 CRL 上,所以我去那里调查了一下。Internet Explorer 在打开 CRL 时没有问题,并且正确显示它们,没有任何错误通知。另一方面,Firefox 拒绝并给出“错误代码 ffffe00a”,这表明签名有问题 ( Error -8182: SEC_ERROR_BAD_SIGNATURE: Peer's certificate has an invalid signature.
)。然而,这只发生在我做过首先导入 CA 证书。如果不导入,则 CRL 可以毫无问题地被接受。
openssl
我已经使用我能接触到的和 Microsoft 的任何调用验证了所有证书和 CRL certutil.exe
,所有这些都让我赞许。
将我的证书与上述文章中的演示证书并排摆放,我没有发现任何区别——当然,除了名称之外。所以理论上它们的行为应该相同。但是尝试导入演示 CA 的根证书,然后查看 CRL,在所有浏览器中都可以工作,而我自己的根 CA 会导致那些奇怪的错误。(由于缺少演示 CA 的私钥,我当然无法测试演示 CA 颁发的证书是否有效。)
我陷入了困境。我似乎错过了一些微妙但重要的东西,但我没有想法和资源。感谢您的任何建议或指示。
答案1
如果从 CA 角度来看证书设置正确,则 Web 服务器或浏览器可能未正确构建链。
确保 Web 服务器已正确安装根证书和中间证书,特别是某些服务器(或负载平衡器)需要使用特定于应用程序的命令“链接”链。
另外,请注意每个浏览器 IE 和 Firefox(不确定 Chrome)都维护自己的 CA 信任存储。您必须将根 CA 和可能的 CA 安装到相应的存储中。
您可能想要使用的另一个用于比较证书的工具是 ASN.1 检查器,可在此处获取 (http://www.lapo.it/asn1js/)
答案2
事实证明,问题只是缓存问题。从头开始重新创建所有 CA 和证书(以防万一),最重要的是:清除浏览器缓存所有浏览器都成功了。
从某种程度上来说,各种关于 CRL 问题的暗示最终成了问题的根源。由于 CRL 应该被缓存(尤其是对于根 CA 来说,它的生命周期相当长),因此它实际上曾是缓存。自从我尝试构建 PKI 以来,我已经多次重新创建各种 CA、CRL 和其他东西。当我进行最终测试时,浏览器拥有最新的 CA 证书,但仍在尝试将其与仍在浏览器缓存中的旧 CRL 进行匹配(CRL 的 URL 没有改变)。当然,它们不匹配,Opera 和 Firefox 都正确地发出了抱怨。
刷新浏览器缓存并重新部署根证书后,我终于在 Web 服务器日志中注意到 Opera 请求了根 CA 和中间 CA 的 CRL — 这是我之前没有看到的(因为它们仍在缓存中)。从那时起,一切都很好。我能够安装根 CA,没有人再抱怨了。
现在真实的工作开始……