OpenSSL验证返回码:20(无法获取本地发行者证书)


76

我正在运行Windows Vista,并且尝试通过https连接以多部分形式上载文件,但是本地发行者证书存在一些问题。我只是想弄清楚为什么现在不行,然后在解决后再返回我的cURL代码。我正在运行命令:

openssl s_client -connect connect_to_site.com:443

它为我提供了VeriSign,Inc.的数字证书,但同时也会引发错误:

Verify return code: 20 (unable to get local issuer certificate)

什么是本地发行人证书?那是我自己计算机上的证书吗?有没有解决的办法?我曾尝试使用-CAfile mozilla.pem文件,但仍然给我同样的错误。


堆栈溢出是一个有关编程和开发问题的网站。这个问题似乎与主题无关,因为它与编程或开发无关。请在帮助中心中查看我可以询问哪些主题。也许Unix&Linux Stack ExchangeInformation Security Stack Exchange是更好的选择。
jww

该网站的网址是什么?没有一个答案能给人留下深刻的印象,但是由于您编辑了重要的细节(例如服务器名称),所以它们无法回答问题。另外,它connect_to_site.com是(或可以是)真实站点。您应该使用,example.com因为IANA为此保留了它。
jww

@jww不行,下划线在域名中无效。
Doktor J

@DoktorJ-域名中的下划线是可以的,而主机名中的下划线过去是被禁止的。connect_to_site.com是域名,而不是主机名。我不知道IDNA是否允许主机名中使用下划线。另请参阅(域名)子域中是否可以有下划线“ _”?
jww

Answers:


93

我遇到了同样的问题,并通过将路径传递到存储CA密钥的目录来解决了该问题。在Ubuntu上是:

openssl s_client -CApath /etc/ssl/certs/ -connect address.com:443

1
Ubuntu错误#396818中讨论了此问题。
哈康A. Hjortland

1
非常感谢!这简直太棒了,这是我第二天开始查找该文件,然后开始发疯,我什至为我的应用程序制作了另一台服务器(一个在DigitalOcean上,另一个在亚马逊上)。再次感谢。干杯。
费利佩

3
您还可以设置路径,/dev/null让客户自己在所有通常的位置搜索证书。
mulllhausen

1
请注意,此路径通常由软件包填充ca-certificates
Josip Rodin

16

如果您使用keyUsage缺少值的自签名证书,也会发生此错误keyCertSign


2
我花了几个小时来追踪。谢谢!
内森·莫因瓦济里

我什至只是尝试使用CA的证书(用法为:keyCertSign),问题是相同的。似乎应该将CA证书或根证书添加到openssl的certsDB(/etc/ssl/certs/ca-certificates.crt)
user1462586

该问题已在OpenSSL中得到了解决(请参见github.com/openssl/openssl/issues/1418),并且该修复应很快可用。
dvo

12

解决方案: 您必须显式添加参数-CAfile your-ca-file.pem

注意:我也尝试-CApath了另一个答案中提到的param ,但对我不起作用。

说明: 错误的unable to get local issuer certificate意思是,该用户openssl不知道您的根CA证书。


注意:如果您的Web服务器具有更多域,请不要忘记也添加-servername your.domain.net参数。此参数将“在ClientHello中设置TLS扩展服务器名”。没有此参数,响应将始终包含默认的SSL证书(不是与您的域匹配的证书)。


非常感谢,我已经花了几个小时了。没什么,但是这!!
Ayush

3

您的服务器是否配置了客户端身份验证?如果是这样,则在与服务器连接时需要通过客户端证书。


3

我在Macports的OSX OpenSSL 1.0.1i上也遇到了同样的问题,并且还必须将CApath指定为一种解决方法(而且正如Ubuntu错误报告中所述,即使无效的CApath也会使openssl出现在默认目录中)。有趣的是,使用PHP的openssl函数(在PHPMailer 5中使用)连接到同一服务器,效果很好。


2

使用客户端身份验证:

openssl s_client -cert ./client-cert.pem -key ./client-key.key -CApath /etc/ssl/certs/ -connect foo.example.com:443

2

将您的CA和根证书放在/ usr / share / ca-certificate或/ usr / local / share / ca-certificate中。然后

dpkg-reconfigure ca证书

甚至使用apt-get重新安装ca-certificate软件包。

完成此操作后,您的证书将被收集到系统的DB中:/etc/ssl/certs/ca-certificates.crt

然后,一切都会好起来的。


我想知道Windows是否有一个文件夹/ usr / share / ca-certificate或/ usr / local / share / ca-certificate。dpkg-reconfigure在Windows中意味着什么?
Harald Coppoolse '19

在Windows中,您可以将证书放入本地计算机证书存储中。运行mmc.exe,然后添加/删除管理单元>证书>本地计算机。把任何终端实体证书到个人存储然后,中间证书进Intermedate文件夹,等等,等等
夹头赫林顿

2

使用中间和根ca创建证书链文件。

cat intermediate/certs/intermediate.cert.pem certs/ca.cert.pem > intermediate/certs/ca-chain.cert.pem

chmod 444 intermediate/certs/ca-chain.cert.pem

然后验证

openssl verify -CAfile intermediate/certs/ca-chain.cert.pem \
  intermediate/certs/www.example.com.cert.pem

www.example.com.cert.pem:确定部署证书


敬请解释您的答案
Intsab Haider

1

我遇到了同样的问题,因为它是发行人证书的主题,所以在将发行人主题值保留在证书中之后就得到了解决。

因此,请检查“证书中的发行人主题值(cert.pem)==发行人的主题(CA.pem)”

openssl verify -CAfile CA.pem cert.pem
cert.pem:确定


0

此错误消息表示未通过(-CAfile ...)给出CABundle,或者未通过自签名根证书关闭CABundle文件。

不用担心 即使您从openssl s_client收到theis消息,服务器连接也将正常工作(假设您也没有犯其他错误)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.