我正在尝试编写一个代码,它接收一个pcap
文件作为输入并从中返回无效的证书。
我已经解析了证书链,并尝试验证它们。因为我从pcap
链长度不恒定的证书链中获取了证书链(有时它们仅包含 1 个自签名(且有效)的证书)。
设为cert0.pem
服务器证书和certk.pem
根 CA 证书。
根据我在线的研究,我尝试按如下方式验证证书:
创建一个
certs.pem
包含以下顺序的证书链的文件:certk.pem
,,certk-1.pem
......,cert0.pem
使用命令(
ca.pem
是包含根证书的文件):openssl verify -CAfile ca.pem certs.pem
但有时即使是有效的证书,验证也会出错,如以下输出所示:
C = US, O = GeoTrust Inc., CN = GeoTrust Global CA <br>
error 20 at 0 depth lookup: unable to get local issuer certificate<br>
error certs.pem: verification failed
请帮帮我,我该如何验证证书链?
此外,有没有办法在同一行添加主机名验证?(我试图添加“ -verify_hostname name
”,但输出再次出乎意料)。
答案1
对于远程证书验证,您在此处提到的错误表明第一的你试图验证的链文件中的本地证书(深度 0),即certk.pem
作为根 CA 证书必须存在/导入在您执行验证的本地客户端受信任证书存储中。
正如 thawte.com 所述支持站点:
这是服务器发送的服务器证书的验证输出。服务器发送其完整的证书链,其中包含 2 个证书,一个(深度 0)是服务器证书“CN=www.yourdomain.com”,另一个是 CA 证书“CN=Thawte Server CA”。与所有根证书一样,此证书是自签名的。
为了避免此错误,您的客户端必须在其受信任的证书存储中(在 CAfile 或 CApath 中)拥有根 CA 证书的本地副本。
另外:请考虑使用-show_chain
验证选项查看证书链中的更多详细信息和/或错误。请注意,在验证来自不受信任的 CA 的证书时,此错误行为是预期的,并且是默认行为。您可以在 openssl 中检查错误代码维基百科。