我维护/增强使用基于浏览器的管理界面的产品。我们来晚了,现在才寻求在浏览器和后端之间支持 HTTPS(Tomcat 前面的 Apache httpd,全部运行在 Linux 上)。
所以......我正在摸索新的(对我来说)领域,其中之一是处理从证书颁发机构获得的证书。
出于测试/教育目的,我从 CA 获得了自己的证书 - 我向他们提供了 CSR,我得到的回报是两件事:
- 服务器.crt 和
- 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”的方法
- 确实包含证书,而不仅仅是来自困惑的用户的一些随机垃圾,然后
- 验证文件包含的证书是否真正构成有效的证书链 - 即文件中证书的顺序是否正确
我知道openssl verify ...
可以做我想做的事情,但我发现让它工作的唯一方法是分别指定两个 CA 提供的文件......
openssl verify -CAfile intermediates.crt server.crt
我想我可以设计我的界面,以便用户分别提供这两个文件。我最终可能只是这样做,而不是期望用户使用文本编辑器将两个文件组合成正确的顺序(对我来说更多的工作,但对我们的用户来说更容易 - 并且更安全)。但在这一点上——天哪——它现在对我来说更像是一种学习练习。似乎必须有某种方式让“openssl”按照 Apache 的要求验证单个证书文件......?
感谢您的任何指导。
答案1
当openssl
(或至少子命令openssl x509
)读取其输入时,如果还有更多输入,它不会触及它,允许链接多个openssl
命令来处理多个组合证书,并使它们轻松拆分回来,而无需使用文本处理命令。
中间证书不受信任:只有通常在操作系统存储中的根证书(通常由 Mozilla、Google Microsoft 等提供的列表)才受信任。因此-CAfile
不应与中间证书一起使用(即使它接受此类证书),否则它不会验证完整的链。-trusted
用于真实(自签名)根证书,但通常仅对于未添加到操作系统存储的内部(非公共)根 CA 才需要。
所有中间证书应通过参数提供-untrusted
。
使用bash
shell 的方便<()
构造,将类似管道的输出转换为类似文件的参数,支持openssl
良好。我在下面做了一些重复(combined.crt
读了两次),这可能可以通过更好的脚本或语言来避免,但它仍然很简单。
命令变为(需要bash
shell):
openssl verify -untrusted <( { openssl x509 >/dev/null; cat; } < combined.crt ) <(openssl x509 < combined.crt)
第一次读取会combined.crt
通过虚拟使用丢弃服务器证书openssl x509
,并返回(所有)后续中间证书,第二次读取combined.crt
会获取第一个(服务器)证书并丢弃其他所有内容。