【问题标题】:python Requests SSL ERROR (certificate verify failed)python请求SSL错误(证书验证失败)
【发布时间】:2018-03-16 02:09:10
【问题描述】:

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

我创建了 ca.crt 和 ca.key。使用 ca.crt & ca.key,我分别为服务器和客户端创建了 server.crt、server.key 和 client.crt、client.key。

我正在使用 python 请求库作为客户端。下面是代码sn-p:

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 的值应该是多少?

【问题讨论】:

    标签: python ssl openssl python-requests


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 它仍然给出异常:(由 SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)'),))
    • @nebi:不知道你的代码到底是什么,证书的内容是什么。但是,在这个未知部分的某个地方存在问题。如果您将重现问题所需的所有内容发布为Minimal, Complete, and Verifiable example,这可能会有所帮助。
    • @nebi:到目前为止,代码看起来不错,但仍不清楚您使用的 ca.crt 与服务器发送的证书有何关系。如果这不包含颁发服务器证书的 CA,或者如果 CA 和服务器证书之间存在中间 CA,这些 CA 既不是由服务器提供,也不是包含在 ca.crt 中,那么验证仍然会失败。此外,证书的主题应与 URL 的主机名匹配。
    • 我已经生成了这样的证书,“openssl req -new -key ca.key -x509 -days 365 -out ca.crt”和“openssl x509 -req -days 365 -in server。 csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt" .我应该提供所有命令吗?
    • @nebi:如果您提供由这些命令生成的实际示例证书可能会更好,以便可以重现这些问题。因为,根据配置和 OpenSSL 版本,相同的命令可能仍会产生不同的证书。
    猜你喜欢
    • 1970-01-01
    • 2014-03-28
    • 2021-11-10
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2019-09-08
    • 2015-06-05
    • 2015-11-19
    相关资源
    最近更新 更多