2016-07-04 50 views
2

我试图连接到公司内部网HTTPS服务器,该服务器使用内部CA,从Python内运行/在Linux机器上运行的请求。我有一个.pem文件,其中包含我们的证书(4096位RSA,CSSM_KEYUSE_VERIFY,CA = true)。将单个证书添加到请求

我把它放到/usr/share/ca-certificates的子文件夹中,并使用sudo dpkg-reconfigure ca-certificates来将它集成到系统中。

requests documentation,我发现:

您可以通过验证路径到CA_BUNDLE文件或目录与信任的CA证书......如果验证设置为一个目录的路径,该目录必须有使用OpenSSL提供的c_rehash实用程序进行处理。

我相信(但不确定)/etc/ssl/certs满足这种情况。现在

,我试图以各种方式要求:

requests.get(download_url) 
# throws requests.exceptions.SSLError: ("bad handshake: Error([ 
# ('SSL routines', 'ssl3_get_server_certificate', 
# 'certificate verify failed')],)",) 

requests.get(download_url, verify = False) 
# works, but is obviously bad (and spits out a warning) 

requests.get(download_url, verify = pem_file_path) 
# same SSLError as above (option shows no effect) 

requests.get(download_url, cert = pem_file_path) 
requests.get(download_url, cert = '/etc/ssl/certs') 
# both throw OpenSSL.SSL.Error: [ 
# ('PEM routines', 'PEM_read_bio', 'no start line'), 
# ('SSL routines', 'SSL_CTX_use_PrivateKey_file', 'PEM lib')] 

requests.get(download_url, verify = '/etc/ssl/certs') 
# Finally, this raises an unprintable exception: 
# requests.exceptions.SSLError: <exception str() failed> 

其实,using self-signed certificates with requests in python看起来可能说明了同样的问题(但还没有回答)。

+1

你得到一个SSL错误,以便先验证自己与OpenSSL的HTTPS ://www.openssl.org/docs/manmaster/apps/verify.html – stark

+0

你是对的。问题出在证书上,而不是我尝试使用它的方式。 –

回答

0

感谢@stark,我发现问题在于我的证书文件已过期。有了正确的,跟上时代的证书(甚至在DER格式,与.CER扩展名),以下语法现在工作:

requests.get(download_url, verify = cer_file_path) 
+0

你能多说一点吗?我现在有同样的问题,但我已经在线下载了pem文件证书。我如何发现它已过期或不好?我在哪里可以找到一个好的? –

+0

哦,是的,我知道链接已经死了。 http://unix.stackexchange.com/questions/16226/how-can-i-verify-ssl-certificates-on-the-command-line可能有帮助,也许?据我所知,我只是使用''openssl verify/path/to/my.pem''。 –