Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenSSL验证返回代码:20(无法获取本地颁发者证书)_Openssl - Fatal编程技术网

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

我在Macports的OSX OpenSSL 1.0.1i上也遇到了同样的问题,还必须指定CApath作为解决方法(正如Ubuntu bug报告中提到的,即使是无效的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

如果您使用的自签名证书缺少值
keyCertSign
,解决方案: 必须显式地将参数
-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:好的


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

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

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

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

这个问题在中讨论过。非常感谢!这简直太棒了,这是我第二天查这个,我简直疯了,我甚至为我的应用程序做了另一台服务器(一台在DigitalOcean上,另一台在Amazon上)。再次感谢。干杯。您还可以将路径设置为
/dev/null
,让客户端在所有通常的位置搜索证书。请注意,此路径通常由包
ca证书填充。
。堆栈溢出是用于编程和开发问题的站点。这个问题似乎离题了,因为它与编程或开发无关。请参见帮助中心中的。也许或者会是一个更好的提问的地方。这个网站的URL是什么?没有一个答案让人印象深刻,但他们无法回答问题,因为您编辑了重要的细节,如服务器名称。而且,
connect\u to\u site.com
是(或可以是)一个真正的站点。您应该使用
example.com
,因为IANA将其保留用于此目的。@jww不,它不能,下划线在域名中无效。@DoktorJ-域名中的下划线可以,而主机名中的下划线过去是禁止的
connect\u to\u site.com
是一个域名,而不是主机名。我不知道IDNA是否允许主机名中使用下划线。还有,我花了好几个小时追踪这个。非常感谢。我只是尝试了CA证书的用法:keyCertSign,问题是一样的。似乎应该将CA证书或根证书添加到openssl的certsDB(/etc/ssl/certs/CA certificates.crt)中。这个问题今天已在openssl中得到解决(请参阅),并且很快就会得到解决。非常感谢,我已经讨论了几个小时。除了这个什么都没用!!请解释您的答案我想知道windows是否有文件夹/usr/share/ca证书或/usr/local/share/ca证书。dpkg重新配置在windows中意味着什么?在windows中,您将把证书放入本地计算机证书存储中。运行mmc.exe,然后添加/删除管理单元>证书>本地计算机。将任何终端实体证书放入个人存储,然后将中间证书放入Intermedate文件夹,等等。