将单个证书添加到请求中

时间:2016-07-04 10:44:03

标签: python ssl python-requests

我正在尝试连接到企业内部网HTTPS服务器,该服务器使用内部CA,来自在Linux机器上运行的Python /请求中。我有一个包含我们证书的.pem文件(4096位RSA,CSSM_KEYUSE_VERIFY,CA = true)。

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

requests documentation中,我找到了:

  

您可以使用受信任CA的证书验证路径到CA_BUNDLE文件或目录...如果将verify设置为目录的路径,则必须使用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 个答案:

答案 0 :(得分:0)

感谢@stark,我发现问题是我的证书文件已过期。使用正确的最新证书(即使是DER格式,扩展名为.cer),现在可以使用以下语法:

requests.get(download_url, verify = cer_file_path)