python请求SSL错误(证书验证失败)

时间:2017-10-04 15:43:11

标签: python ssl openssl python-requests

我为我的服务器和客户端生成了以下自签名证书。

我创建了ca.crt&的ca.key。使用ca.crt& ca.key,我分别为server和client.crt创建了server.crt,server.key,为client分别创建了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,代码有效,但我想验证。我的请求中 验证 的价值应该是多少?

1 个答案:

答案 0 :(得分:0)

强烈建议您深入了解优秀的请求文档。它有一个关于SSL Cert Validation的特殊章节,它解释了:

  

您可以使用受信任CA的证书验证路径到CA_BUNDLE文件或目录:

>>> requests.get('https://github.com', verify='/path/to/certfile')

假设您的服务器证书已由ca.crt签名,则应将其用于verify参数。

编辑:根据讨论,CA和服务器证书使用相同的主题。这意味着证书验证假定这是一个自签名证书,从而导致证书验证错误。