如何像浏览器一样使用openssl验证证书?
Posted
技术标签:
【中文标题】如何像浏览器一样使用openssl验证证书?【英文标题】:How to use openssl to verify a certificate just like a browser? 【发布时间】:2012-10-13 13:30:13 【问题描述】:我正在使用 openssl 来验证证书,但似乎在一种情况下,即使浏览器认为证书有效,它也无法验证证书。
openssl s_client -connect test.uk.example.com:443 + sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' depth=0 /C=GB/ST=CB/L=Cambridge/O=acme Systems Inc./OU=Development Operations acme/CN=acme.com/CN=*.acme.com/CN=*.uk.acme .com/CN=*.acme.com/CN=*.vmd.acme.com/CN=*.acme.net/CN=*.eng.acme.net 验证错误:num=20:无法获取本地颁发者证书 验证返回:1 depth=0 /C=GB/ST=CB/L=Cambridge/O=acme Systems Inc./OU=Development Operations acme/CN=acme.com/CN=*.acme.com/CN=*.uk.acme .com/CN=*.acme.com/CN=*.vmd.acme.com/CN=*.acme.net/CN=*.eng.acme.net 验证错误:num=27:证书不受信任 验证返回:1 depth=0 /C=GB/ST=CB/L=Cambridge/O=acme Systems Inc./OU=Development Operations acme/CN=acme.com/CN=*.acme.com/CN=*.uk.acme .com/CN=*.acme.com/CN=*.vmd.acme.com/CN=*.acme.net/CN=*.eng.acme.net 验证错误:num=21:无法验证第一个证书 验证返回:1浏览器正确验证了相同的证书。
我应该如何调用 oepnssl 以确保验证通过?
【问题讨论】:
【参考方案1】:最可能的原因是 OpenSSL 尚未配置或找不到用于验证证书路径的信任锚列表。
您可以使用-CApath
或-CAfile
显式传递它们。
【讨论】:
你说得对,你还能提供一个脚本化的解决方案来安装这些证书吗? 如果您的操作系统没有预定义列表,一种方法是使用从 Firefox 中提取列表的 Curl 脚本:curl.haxx.se/docs/caextract.html 我试过openssl s_client -connect $REMHOST:$REMPORT -CAfile cacert.pem
,但我得到了同样的错误。 (cacert.pem 是从您发布的链接中获取的文件)
从您的问题中很难知道您发布的 DN 是否是虚拟的。您可能正在使用您自己的内部 CA 颁发的证书。无论如何,在您的示例中显然使用了非标准的 CN。您还可以使用 this SSL checker 检查完整的服务器配置。
@sorin 对于大多数平台,您还可以尝试openssl version -d
返回的路径的certs
子目录。也就是说,为您的openssl s_client
命令提供选项-CApath $(openssl version -d | awk -F'"' ' print $2 ')/certs
。 Cygwin 和 Ubuntu 至少在那里有一组可用的公共 CA 证书。我记得这些不再由 OpenSSL 本身提供,因此这些 CA 证书作为指向平台提供的证书存储库的符号链接提供。以上是关于如何像浏览器一样使用openssl验证证书?的主要内容,如果未能解决你的问题,请参考以下文章