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

标签 python ssl openssl python-requests

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

我已经创建了 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)

这给出了异常(exception):

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

最佳答案

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

You can pass verify the path to a CA_BUNDLE file or directory with certificates of trusted CAs:

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

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

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

关于python 请求 SSL 错误(证书验证失败),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46568969/

相关文章:

python - 如何在不损坏文本的情况下去除点/噪音?

security - 在本地主机上获取 ssl 证书

SSL 额外流量?

codeigniter - 带有 SSL 的 CodeIgniter 中的 basepath 或 apppath 有问题 - 在错误的地方查找?

c - c中的openssl aes_128_ctr

c - 为什么哈希值是错误的?

python - Matplotlib 在一张图中绘制多个条形图

python - 如何解决 python 脚本的 cron 执行和终端执行之间的差异?

python - Flask-RESTful 别名

c - 使用 CAPI 时是否有 ENGINE_load_private_key() 的替代品?