将单个证书添加到请求中。

4
我正在尝试在Linux机器上使用Python/requests连接企业内部HTTPS服务器,该服务器使用内部CA。 我有一个包含我们证书(4096位RSA,CSSM_KEYUSE_VERIFY,CA = true)的.pem文件。
我将其放入/usr/share/ca-certificates的子文件夹中,并使用sudo dpkg-reconfigure ca-certificates将其集成到系统中。
requests文档中,我找到了以下内容:
“您可以通过验证CA_BUNDLE文件或具有受信任CA证书的目录的路径来传递verify...如果将verify设置为目录的路径,则必须使用OpenSSL提供的c_rehash实用程序处理该目录。”
我认为(但不确定)/etc/ssl/certs符合此条件。
现在,我以各种方式尝试了requests:
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>

实际上,在Python中使用自签名证书进行请求看起来可能描述了同样的问题(但尚未得到解答)。


1
你遇到了SSL错误,因此首先请使用openssl https://www.openssl.org/docs/manmaster/apps/verify.html验证自己的SSL。 - stark
你是对的。问题出在证书上,而不是我尝试使用它的方式上。 - hans_meine
1个回答

3

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

requests.get(download_url, verify = cer_file_path)

你能详细说明一下吗?我现在也遇到了同样的问题,但我已经在线下载了pem文件证书。我该如何确定它是否过期或无效?在哪里可以找到好的证书? - Conrad C
哦,是的,我看到链接已经失效了。也许这个链接可以帮助你:http://unix.stackexchange.com/questions/16226/how-can-i-verify-ssl-certificates-on-the-command-line?就我所知,我只是使用了``openssl verify /path/to/my.pem``。 - hans_meine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接