【问题标题】:Add single certificate to requests向请求添加单个证书
【发布时间】: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 看起来可以描述相同的问题(但尚未得到答复)。

【问题讨论】:

标签: python ssl python-requests


【解决方案1】:

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

requests.get(download_url, verify = cer_file_path)

【讨论】:

  • 你能详细说明一下吗?我现在也有同样的问题,但是我已经在线下载了 pem 文件证书。我怎么知道它是过期的还是坏的?我在哪里可以找到一个好的?
  • 哦,是的,链接失效了,我明白了。 unix.stackexchange.com/questions/16226/… 可能会有所帮助吗?据我所知,我只是使用了openssl verify /path/to/my.pem
猜你喜欢
  • 1970-01-01
  • 2015-05-12
  • 2018-08-15
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 2016-12-16
相关资源
最近更新 更多