我尝试使用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。
版本:
非常感谢任何帮助。
干杯 - 埃里克
答案 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