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

Posted

技术标签:

【中文标题】OpenSSL 验证返回码:20(无法获取本地颁发者证书)【英文标题】:OpenSSL Verify return code: 20 (unable to get local issuer certificate) 【发布时间】:2012-07-17 21:35:21 【问题描述】:

我正在运行 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 文件,但仍然给我同样的错误。

【问题讨论】:

Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Unix & Linux Stack Exchange 或Information Security Stack Exchange 会是一个更好的提问地点。 @jww 不行,下划线在域名中无效。 @DoktorJ - 域名中的下划线是可以的,而主机名中的下划线过去是被禁止的。 connect_to_site.com 是域名,不是主机名。我不知道 IDNA 是否允许在主机名中使用下划线。另见Can (domain name) subdomains have an underscore “_” in it?。 【参考方案1】:

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

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

【讨论】:

这个问题在Ubuntu bug #396818讨论。 您还可以将路径设置为/dev/null,让您的客户自行在所有常用位置搜索证书。 请注意,此路径通常由包ca-certificates填充。 @Jan 你能帮我解决类似的问题吗?尽管我指定了 CApath、CAfile 和其他所有内容,但我还是无法解决它。***.com/questions/69836489/…【参考方案2】:

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

【讨论】:

我花了几个小时来追踪这个问题。谢谢! 我刚刚尝试了使用 CA 的证书:keyCertSign,问题是一样的。看来应该将CA证书或根证书添加到openssl的certsDB(/etc/ssl/certs/ca-certificates.crt) 这个问题今天已在 OpenSSL 中得到修复(请参阅 github.com/openssl/openssl/issues/1418)并且应该很快就会提供修复。 @Conrado 你能帮我解决类似的问题吗?尽管我指定了 CApath、CAfile 和其他所有内容,但我还是无法解决它。***.com/questions/69836489/…【参考方案3】:

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

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

解释: 错误 unable to get local issuer certificate 表示 openssl 不知道您的根 CA 证书。


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

【讨论】:

非常感谢,我已经做了好几个小时了。除了这个没有任何效果! @Martin 你能帮我解决类似的问题吗?尽管我指定了 CApath、CAfile 和其他所有内容,但我还是无法解决它。***.com/questions/69836489/…【参考方案4】:

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

【讨论】:

你能帮我解决类似的问题吗?尽管我指定了 CApath、CAfile 和其他所有内容,但我还是无法解决它。***.com/questions/69836489/…【参考方案5】:

我在 Macports 的 OSX OpenSSL 1.0.1i 上遇到了同样的问题,并且还必须指定 CApath 作为解决方法(正如 Ubuntu 错误报告中所述,即使是 invalid CApath 也会使 openssl查看默认目录)。 有趣的是,使用 php 的 openssl 函数(在 PHPMailer 5 中使用)连接到同一台服务器工作正常。

【讨论】:

【参考方案6】:

将您的 CA 和根证书放入 /usr/share/ca-certificate 或 /usr/local/share/ca-certificate。 那么

dpkg-reconfigure ca-certificates

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

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

那么一切都会好起来的。

【讨论】:

我想知道windows是否有文件夹/usr/share/ca-certificate或/usr/local/share/ca-certificate。 dpkg-reconfigure 在 Windows 中意味着什么? 在 Windows 中,您可以将证书放入本地计算机证书存储区。运行 mmc.exe,然后添加/删除管理单元>证书>本地计算机。然后将任何最终实体证书放入个人存储,将中间证书放入中间文件夹等。【参考方案7】:

使用客户端身份验证:

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

【讨论】:

你能帮我解决类似的问题吗?尽管我指定了 CApath、CAfile 和其他所有内容,但我还是无法解决它。***.com/questions/69836489/…【参考方案8】:

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

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:好的 部署证书

【讨论】:

请解释你的答案 你能帮我解决类似的问题吗?尽管我指定了 CApath、CAfile 和其他所有内容,但我还是无法解决它。***.com/questions/69836489/…【参考方案9】:

我遇到了同样的问题, 将颁发者主题值保留在证书中后得到修复,因为它是颁发者证​​书的主题。

所以请检查“证书中的颁发者主题值(cert.pem)==颁发者主题(CA.pem)”

openssl 验证 -CAfile CA.pem cert.pem cert.pem:好的

【讨论】:

【参考方案10】:

此错误消息意味着 CABundle 不是由 (-CAfile ...) 给出的 要么 CABundle 文件未被自签名根证书关闭。

别担心。与服务器的连接甚至可以工作 您从 openssl s_client 收到 theis 消息... (假设你也没有犯其他错误)

【讨论】:

以上是关于OpenSSL 验证返回码:20(无法获取本地颁发者证书)的主要内容,如果未能解决你的问题,请参考以下文章

openssl 无法获取本地颁发者证书 debian

“验证返回码:21(无法验证第一个证书)”

Ruby 2.6.6 OpenSSL 1.1.1g - 证书验证失败(无法获取本地颁发者证书)

OpenSSL:无法获取本地颁发者证书

无法连接到 APNS:返回代码 20(无法获取本地颁发者证书)

证书验证失败:无法获取本地颁发者证书