【发布时间】:2016-07-04 10:44:03
【问题描述】:
我正在尝试从在 Linux 机器上运行的 Python/请求中连接到使用内部 CA 的公司 Intranet HTTPS 服务器。我有一个 .pem 文件,其中包含我们的证书(4096 位 RSA,CSSM_KEYUSE_VERIFY,CA = true)。
我把它放在/usr/share/ca-certificates 的子文件夹中,并使用sudo dpkg-reconfigure ca-certificates 将其集成到系统中。
在requests documentation,我发现:
您可以将 verify 路径传递到 CA_BUNDLE 文件或具有受信任 CA 证书的目录……如果 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 看起来可以描述相同的问题(但尚未得到答复)。
【问题讨论】:
-
您遇到了 SSL 错误,因此请先使用 openssl openssl.org/docs/manmaster/apps/verify.html 验证您自己的错误
-
你是对的。问题出在证书上,而不是我尝试使用它的方式。
标签: python ssl python-requests