openssl verify - 如何验证单个组合证书捆绑文件

openssl verify - 如何验证单个组合证书捆绑文件

我维护/增强使用基于浏览器的管理界面的产品。我们来晚了,现在才寻求在浏览器和后端之间支持 HTTPS(Tomcat 前面的 Apache httpd,全部运行在 Linux 上)。

所以......我正在摸索新的(对我来说)领域,其中之一是处理从证书颁发机构获得的证书。

出于测试/教育目的,我从 CA 获得了自己的证书 - 我向他们提供了 CSR,我得到的回报是两件事:

  1. 服务器.crt 和
  2. middles.crt(包含至少一个 - 也许更多? - 中间证书的文件)

IIUC 这两个文件都需要安装到我们的 Apache 中。但由于我们的产品附带的 Apache 是较新的品种(请阅读:httpd.conf 指令'SSL证书链文件' 在版本 2.4.8 之后已被删除),来自 CA 的两个文件必须合并为一个文件,如下所示(使用 Apache 'SSL证书文件' 指向该文件):

cat server.crt intermediates.crt > combined.crt

好的。阿帕奇很高兴。

我遇到的问题是如何验证“combined.crt”文件的正确性。由于它将是用户生成的 - 并且用户搞砸了 - 我想对文件进行一些验证。 FWIW...我们的产品完全向用户隐藏了 Linux - 用户无权访问 Linux 命令提示符、root 等。用户管理我们产品的所有操作都是通过我们产品的前端完成的界面。因此,任何涉及用户进入 Linux 提示符的答案都是行不通的。

我无法找出任何使用“openssl”来验证用户从 CA 提供的文件创建的输入“combined.crt”的方法

  1. 确实包含证书,而不仅仅是来自困惑的用户的一些随机垃圾,然后
  2. 验证文件包含的证书是否真正构成有效的证书链 - 即文件中证书的顺序是否正确

我知道openssl verify ...可以做我想做的事情,但我发现让它工作的唯一方法是分别指定两个 CA 提供的文件......

openssl verify -CAfile intermediates.crt server.crt

我想我可以设计我的界面,以便用户分别提供这两个文件。我最终可能只是这样做,而不是期望用户使用文本编辑器将两个文件组合成正确的顺序(对我来说更多的工作,但对我们的用户来说更容易 - 并且更安全)。但在这一点上——天哪——它现在对我来说更像是一种学习练习。似乎必须有某种方式让“openssl”按照 Apache 的要求验证单个证书文件......?

感谢您的任何指导。

答案1

openssl(或至少子命令openssl x509)读取其输入时,如果还有更多输入,它不会触及它,允许链接多个openssl命令来处理多个组合证书,并使它们轻松拆分回来,而无需使用文本处理命令。

中间证书不受信任:只有通常在操作系统存储中的根证书(通常由 Mozilla、Google Microsoft 等提供的列表)才受信任。因此-CAfile不应与中间证书一起使用(即使它接受此类证书),否则它不会验证完整的链。-trusted用于真实(自签名)证书,但通常仅对于未添加到操作系统存储的内部(非公共)根 CA 才需要。

所有中间证书应通过参数提供-untrusted

使用bashshell 的方便<()构造,将类似管道的输出转换为类似文件的参数,支持openssl良好。我在下面做了一些重复(combined.crt读了两次),这可能可以通过更好的脚本或语言来避免,但它仍然很简单。

命令变为(需要bashshell):

openssl verify -untrusted <( { openssl x509 >/dev/null; cat; } < combined.crt ) <(openssl x509 < combined.crt)

第一次读取会combined.crt通过虚拟使用丢弃服务器证书openssl x509,并返回(所有)后续中间证书,第二次读取combined.crt会获取第一个(服务器)证书并丢弃其他所有内容。

相关内容