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

OpenSSL验证返回代码:20(无法获取本地颁发者证书),openssl,Openssl,我正在运行Windows Vista,并试图通过https连接以多部分形式上载文件,但我在本地颁发者证书方面遇到一些问题。我只是想弄清楚为什么这个现在不起作用,然后在这个问题解决后再回到我的cURL代码。我正在运行命令: openssl s_client -connect connect_to_site.com:443 它给了我一个VeriSign,Inc.的数字证书,但也抛出了一个错误: Verify return code: 20 (unable to get local issuer c

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

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

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

我也遇到了同样的问题,并通过向存储CA密钥的目录传递路径解决了这个问题。在Ubuntu上:

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

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

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

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

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

客户端身份验证:

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

使用客户端身份验证:

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

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

解决方案: 必须显式地将参数
-CAfile添加到ca文件.pem

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

说明: 错误
无法获取本地颁发者证书
意味着
openssl
不知道您的根CA证书


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

解决方案: 必须显式地将参数
-CAfile添加到ca文件.pem

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

说明: 错误
无法获取本地颁发者证书
意味着
openssl
不知道您的根CA证书


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

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

因此,请检查“证书中的发卡机构主体值(cert.pem)=发卡机构主体(CA.pem)”

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

我也面临同样的问题, 它在证书中保留颁发者主题值后得到固定,因为它是颁发者证书的主题

因此,请检查“证书中的发卡机构主体值(cert.pem)=发卡机构主体(CA.pem)”

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


将CA和根证书放入/usr/share/CA证书或/usr/local/share/CA证书中。 然后

dpkg重新配置ca证书

甚至可以使用apt get重新安装ca证书包

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


然后一切都会好起来。

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

dpkg重新配置ca证书

甚至可以使用apt get重新安装ca证书包

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


然后一切正常。

使用中间ca和根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:好的
部署certific

使用中间ca和根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:好的
部署certific

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

别担心。与服务器的连接甚至可以正常工作 您从openssl s_客户端收到消息。。。
(假设您没有犯其他错误)

此错误消息表示 CABundle不是由(-CAfile…)给出的 或 自签名根证书未关闭CABundle文件

别担心。与服务器的连接甚至可以正常工作 您从openssl s_客户端收到消息。。。 (假设你没有犯其他错误)

这个问题在中讨论过。非常感谢!