我已经为我的服务器和客户端生成了以下自签名证书。
我创建了ca.crt和ca.key。使用ca.crt和ca.key,我分别为服务器创建了server.crt和server.key,为客户端创建了client.crt和client.key。
我正在使用Python请求库作为客户端。以下是代码片段:
这会引发异常:
我创建了ca.crt和ca.key。使用ca.crt和ca.key,我分别为服务器创建了server.crt和server.key,为客户端创建了client.crt和client.key。
我正在使用Python请求库作为客户端。以下是代码片段:
import json
import requests
cert = ("/home/tests/certs/client.crt",
"/home/tests/certs/client.key")
class TestCart():
def test_cart(self, **kwargs):
url = "https://192.168.X.Y/cart"
cart_data = {
'id': kwargs.get('id'),
'items': kwargs.get('items')
}
req_data = json.dumps(cart_data)
resp = requests.post(url,
data=req_data,
verify="/home/certs/ca.cert",
cert=cert)
print resp.text
if __name__ == '__main__':
t_cart = TestCart()
data = {'id': 'ba396e79-0f0f-4952-a931-5a528c9ff72c', 'items': []}
t_cart.test_cart(**data)
这会引发异常:
requests.exceptions.SSLError: HTTPSConnectionPool(host='192.168.X.Y',
port=443): Max retries exceeded with url: /cart (Caused by
SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify
failed (_ssl.c:590)'),))
如果我使用verify=False,代码可以运行,但是我想要验证。在我的请求中,verify应该是什么值?
ca.crt
与服务器发送的证书有何关系。如果此文件不包含颁发服务器证书的 CA,或者在 CA 和服务器证书之间存在中间 CA,这些中间 CA 既未由服务器提供,也未包含在ca.crt
中,则验证仍将失败。此外,证书的主题应与 URL 的主机名匹配。 - Steffen Ullrich