请求证书参数未清除

问题描述 投票:0回答:1

我在 python requests 库将先前调用中传递的证书保留到将来的调用中时遇到问题。第一次调用外部 API 时,我收到一条正常的错误令牌错误消息。然后,我进行一个调用,通过请求中的 cert=cert 行传递证书,该调用也返回正常。然后,我对与第一个相同的 URL 进行第三次调用,它响应“400 SSL 证书错误”。这似乎是服务器拒绝了我没有通过的证书,并且请求没有共享会话。

这是我用来重现此问题的示例代码,但在 cert 中具有有效的证书值。

import requests

if __name__ == '__main__':
    url = 'https://auth.smaapis.de/oauth2/token'
    cert = ('example_cert.pem', 'example_cert_key.pem')

    response = requests.post(url)
    print('Before Response: {} {}: {}\n'.format(response.status_code, response.reason, response.text))

    response = requests.get('https://google.com', cert=cert)

    response = requests.post(url)
    print('After Response:  {} {}: {}\n'.format(response.status_code, response.reason, response.text))
Before Response: 400 invalid_request: Missing form parameter: grant_type
After Response: 400 The SSL certificate error

如果中间请求被注释掉,最后一个请求将再次开始收到正常错误,而不是 400 SSL 错误。我做了一些调试,这似乎是由于 requests/adapters.py 中的 ssl_context 对象被所有请求调用重用了。

在不弹出会话的情况下共享会话似乎使其工作,这似乎违反直觉,但这不是我的实际代码的选项:

import requests


if __name__ == '__main__':
    url = 'https://auth.smaapis.de/oauth2/token'
    cert = ('example_cert.pem', 'example_cert_key.pem')

    session = requests.Session()

    request = session.post(url)
    print('Before Response: {} {}: {}\n'.format(response.status_code, response.reason, response.text))

    request = session.get('https://google.com', cert=cert)

    request = session.post(url)
    print('After Response:  {} {}: {}\n'.format(response.status_code, response.reason, response.text))
Before Response: 400 invalid_request: Missing form parameter: grant_type
After Response:  400 invalid_request: Missing form parameter: grant_type

这只发生在最新版本的 requests 2.32 之后,但在 2.31 上没有发生

我避免设置 verify=False 因为我仍然需要标准的 certifi 证书。这可能是请求中可能存在的错误,还是我错误地假设了这个概念?

ssl python-requests urllib3
1个回答
0
投票

我可以重现你描述的“无证行为”。

在版本 2.31.0 中它按预期工作,从版本 2.32.0 开始它就被破坏了。

问题似乎(正如您怀疑的那样)出现在以下更改中(https://requests.readthedocs.io/en/latest/community/updates/#id4):

改进 - verify=True 现在重用全局 SSLContext,这应该可以改善第一个和后续请求之间的请求时间差异 请求。它还应该最大限度地减少 Windows 上的证书加载时间 使用使用 OpenSSL 3.x 构建的 Python 版本时的系统。 (#6667)

可以找到类似的问题(https://github.com/psf/requests/issues/6726)甚至建议的补丁(https://github.com/psf/requests/commit/fe251aa94b2b7849e224e455c0aad0df53ad3d8e)在 requests 的 Github 上。

不幸的是,该补丁尚未进入main分支。

© www.soinside.com 2019 - 2024. All rights reserved.