使用客户端证书的Python请求GET失败

时间:2017-10-09 13:46:01

标签: python python-requests urllib3

我尝试使用Python请求向需要客户端证书的API发送HTTP GET请求。我使用

将PEM和密钥文件传入GET请求
session = requests.Session()
session.get('https://localhost/rest/containers/7uyeogzKQayw4mmQmcJb2Q/listeners', cert=('development.pem', 'development.key'))

拨打此电话时,我使用NGINX作为端点,我得到了:

2017-10-07 21:18:16,874 - containerLogger - DEBUG - code:400   text:
<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx/1.12.1</center>
</body>
</html>

我使用相同的证书对相同的端点使用POST请求测试了相同的API并且成功了。我已经成功使用浏览器(Firefox)验证了相同的GET。

我目前正试图找出POST成功的原因,但GET失败了。我没有找到答案的运气。

不确定这是由于请求还是urllib3。

版本:

  • Java 1.8
  • Jython 2.7.1
  • Python 2.7.10
  • 请求2.18.1
  • urllib3
  • certifi 2017.04.17

非常感谢任何帮助。

干杯 - 埃里克

2 个答案:

答案 0 :(得分:0)

当您创建session = requests.Session()文档请求时,session.cert = '/path/to/client-cert.crt'

更简单的方法是将其作为元组传递。

requests.get('https://localhost/rest/containers/7uyeogzKQayw4mmQmcJb2Q/listeners', cert=('/path/client.cert', '/path/client.key'))

文档链接

答案 1 :(得分:0)

我偶然发现了同样的问题。 这是我的解决方案:

response = requests.get(url, cert=(curr_cert, curr_key), verify=False)
print response.content

您缺少受信任的证书。请求验证HTTPS请求的SSL证书,就像Web浏览器一样。默认情况下,启用SSL验证,如果无法验证证书(就像您的情况一样),请求将抛出SSLError

verify = False 应该可以解决问题

通过设置verify = False,您将收到如下警告:

InsecureRequestWarning:发出未经验证的HTTPS请求。强烈建议添加证书验证。参见:https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings

如果您想验证ssl验证,则以下内容应会有所帮助:

response = requests.get(url, cert=(curr_cert, curr_key), verify=verify='/path/to/trustedcertfile')
print response.content