为什么我需要OpenSSL的-CApath来使用我的证书?

为什么我需要OpenSSL的-CApath来使用我的证书?,openssl,ssl-certificate,Openssl,Ssl Certificate,我遇到了一个问题,我收到了一条错误消息: Download error on https://pypi.python.org/simple/: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598) -- Some packages may not be found! 这是我自己定制的OpenSSL编译。然而,我的网络浏览器信任这个网站 我试着转到/certs/并将证书放入其中,然后运行一个小BASH脚本以

我遇到了一个问题,我收到了一条错误消息:

Download error on https://pypi.python.org/simple/: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598) -- Some packages may not be found!
这是我自己定制的OpenSSL编译。然而,我的网络浏览器信任这个网站

我试着转到
/certs/
并将证书放入其中,然后运行一个小BASH脚本以
.0
格式为每个证书创建符号链接。我在一些地方读到过,这就是它的工作原理

for f in *.pem
do
  ln -s "$f" `openssl x509 -hash -noout -in "$f"`.0
done
我有点能让它工作。。。运行时:

openssl s_client -showcerts -connect pypi.python.org:443 -CApath .
openssl s_client -showcerts -connect pypi.python.org:443
我得到(截断)

但是,当我跑步时:

openssl s_client -showcerts -connect pypi.python.org:443 -CApath .
openssl s_client -showcerts -connect pypi.python.org:443
我得到:

Start Time: 1399591046
Timeout   : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
为什么仅当我指定-CApath时


如何使其默认使用这些证书?

使用此命令,您可以验证证书来自的公司:

openssl s_client -connect pypi.python.org:443
结果:

depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance CA-3
verify error:num=20:unable to get local issuer certificate
您没有它的根证书。。。然后,您可以从以下位置下载DigicertAssureDiroditca.crt:

并与
-CAfile
一起使用:

openssl s_client -connect pypi.python.org:443 -CAfile DigiCertAssuredIDRootCA.crt 

现在它工作了

使用此命令,您可以验证证书来自的公司:

openssl s_client -connect pypi.python.org:443
结果:

depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance CA-3
verify error:num=20:unable to get local issuer certificate
您没有它的根证书。。。然后,您可以从以下位置下载DigicertAssureDiroditca.crt:

并与
-CAfile
一起使用:

openssl s_client -connect pypi.python.org:443 -CAfile DigiCertAssuredIDRootCA.crt 

现在它工作了

如果你想要任何有建设性的答案,你需要添加更多的细节。我现在给出的信息很少,我的猜测是:您需要指定一个ca证书捆绑包,以允许验证服务器声明。请注意,openssl本身带有一个空包。谢谢,我希望知道要添加哪些其他详细信息。。。我有一个普通的OpenSSL安装,我注意到“certs”目录是空的,我尝试了各种方法,从谷歌搜索安装证书,但没有任何效果。我在我的web浏览器上找到了正在使用的证书,我可以很容易地导出它。。。我想我可以把它添加到我的openssl安装中?这个问题属于Stack Exchange网络中的另一个站点,因为它不是一个编程问题。可能是信息安全堆栈交换()。如果您想要任何有建设性的答案,您需要添加更多的细节。我现在给出的信息很少,我的猜测是:您需要指定一个ca证书捆绑包,以允许验证服务器声明。请注意,openssl本身带有一个空包。谢谢,我希望知道要添加哪些其他详细信息。。。我有一个普通的OpenSSL安装,我注意到“certs”目录是空的,我尝试了各种方法,从谷歌搜索安装证书,但没有任何效果。我在我的web浏览器上找到了正在使用的证书,我可以很容易地导出它。。。我想我可以把它添加到我的openssl安装中?这个问题属于Stack Exchange网络中的另一个站点,因为它不是一个编程问题。也许是信息安全堆栈交换()。太棒了!谢谢,这确实澄清了很多。如何使OpenSSL在默认情况下使用它?这取决于您的场景@Scott-“…如何使OpenSSL在默认情况下使用它?”-OpenSSL的安全模型与浏览器安全模型不同。默认情况下,OpenSSL不信任任何东西。在使用OpenSSL时,必须明确指定要信任的内容。这与浏览器不同,浏览器默认情况下几乎信任所有东西。哦,对不起,现在我明白你的意思了。。。你可以使用所谓的“CA包”。。。我使用cURL中的这个:下载cacert.pem并使用它而不是digicertasuredidrootca.crt。所以你的OpenSSL将能够识别一切。。。这与从多家公司下载多个根证书并放入单个文件是一样的!v;-)太好了!谢谢,这确实澄清了很多。如何使OpenSSL在默认情况下使用它?这取决于您的场景@Scott-“…如何使OpenSSL在默认情况下使用它?”-OpenSSL的安全模型与浏览器安全模型不同。默认情况下,OpenSSL不信任任何东西。在使用OpenSSL时,必须明确指定要信任的内容。这与浏览器不同,浏览器默认情况下几乎信任所有东西。哦,对不起,现在我明白你的意思了。。。你可以使用所谓的“CA包”。。。我使用cURL中的这个:下载cacert.pem并使用它而不是digicertasuredidrootca.crt。所以你的OpenSSL将能够识别一切。。。这与从多家公司下载多个根证书并放入单个文件是一样的!v;-)