86

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

4

12 回答 12

98

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

openssl s_client -CApath /etc/ssl/certs/ -connect address.com:443
于 2013-01-03T17:22:30.140 回答
19

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

于 2016-09-16T17:07:13.473 回答
16

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

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

说明: 错误unable to get local issuer certificate意味着openssl不知道您的根 CA 证书。


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

于 2017-04-19T10:16:07.660 回答
3

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

于 2014-10-07T04:22:00.450 回答
3

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

于 2012-10-03T17:04:46.897 回答
3

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

dpkg-重新配置 ca 证书

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

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

那么一切都应该没问题。

于 2017-11-04T08:01:09.953 回答
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: OK 部署证书

于 2018-10-24T12:26:18.453 回答
2

使用客户端身份验证:

openssl s_client -cert ./client-cert.pem -key ./client-key.key -CApath /etc/ssl/certs/ -connect foo.example.com:443
于 2015-07-31T01:28:17.337 回答
1

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

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

openssl 验证 -CAfile CA.pem cert.pem
cert.pem: OK

于 2017-09-19T06:56:46.313 回答
0

当我的 NGINX 服务器在其配置的证书文件中没有完整的证书链时,我遇到了这个问题。

我的解决方案是找到一个类似的服务器并从该服务器中提取证书,例如:

openssl s_client -showcerts -CAfile my_local_issuer_CA.cer -connect my.example.com:443 > output.txt

然后,我将来自该“output.txt”文件(机器证书除外)的 ASCII 装甲证书添加到我的机器证书文件的副本中,并将 NGINX 指向该复制的文件,错误就消失了。

于 2022-02-18T15:48:57.823 回答
0

我将通过执行以下操作更新@user1462586 答案:

我认为它更适合使用update-ca-certificates命令,包含在ca-certificates包中而不是dpkg-reconfigure.

所以基本上,我会改变它的有用答案:

  1. 检索证书(从此stackoverflow答案并将其写入正确的目录:
# let's say we call it my-own-cert.crt
openssl s_client -CApath /etc/ssl/certs/ -connect <hostname.domain.tld>:<port> 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /usr/share/ca-certificates/my-own-cert.crt

如果您需要其他证书,请重复此操作。

例如,如果您需要带有 Active Directory 的 ldaps/starttls 的 CA 证书,请参阅此处了解如何处理这个 + 使用 openssl 将其转换为 pem/crt:

openssl x509 -inform der -in LdapSecure.cer -out my-own-ca.pem
#and copy it in the right directory...
cp my-own-ca.pem /usr/share/ca-certificates/my-own-ca.crt
  1. 将此证书添加到/etc/ca-certificates.conf配置文件中:
echo "my-own-cert.crt" >> /etc/ca-certificates.conf
echo "my-own-ca.crt" >> /etc/ca-certificates.conf
  1. 更新/etc/ssl/certs目录:
update-ca-certificate
  1. 享受

请注意,如果您使用私有域名机器,而不是合法的公共域名,您可能需要编辑您的/etc/hosts文件才能拥有相应的FQDN.

于 2022-02-16T14:24:14.673 回答
0

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

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

于 2019-03-24T20:53:49.807 回答