Python requests模块 SSL证书验证错误

0 投票
1 回答
2086 浏览
提问于 2025-04-19 11:56

我正在尝试使用requests模块向一个需要SSL认证的接口发送POST请求。我的pem文件在指定的路径下,里面包含了客户端证书和私钥。但是,我一直收到“证书验证失败”的错误。我在nginx的日志中看到,请求根本没有到达那里。有没有人知道这是为什么?我知道这些证书应该是有效的。

params = {    
          "param_2" : "32100",
          "param_1" : "abc"
          }

headers = {
           "Content-Type" : "application/json"
          }
body = json.dumps(params)

r = requests.post(
                  https://somesite.com/somepath,
                  data=body,
                  headers=headers,
                  timeout=10,
                  verify="/path/to/cert.pem"
                  )

Traceback (most recent call last):
File "./somefile.py", line 264, in <module>
    start()
File "./somefile.py", line 149, in start
    verify="/path/to/cert.pem"
File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 88, in post
    return request('post', url, data=data, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 448, in    request
    resp = self.send(prep, **send_kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 554, in send
   r = adapter.send(request, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 417, in send
   raise SSLError(e, request=request)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL     routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

1 个回答

2

来自请求文档的内容:

如果你把验证设置为 False,Requests 也可以忽略 SSL 证书的验证。

比如,你可以这样写:
requests.get('https://kennethreitz.com', verify=False)

默认情况下,验证是设置为 True 的。选项 verify 只适用于主机证书。

你还可以指定一个本地证书作为客户端证书,可以是一个文件(包含私钥和证书),也可以是两个文件路径的元组:

比如,你可以这样写:
requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key'))

所以看起来你只是参数写错了。试试用 'cert' 而不是 verify。

撰写回答