gpt4 book ai didi

python - 请求模块抛出 OpenSSL.SSL.Error

转载 作者:太空宇宙 更新时间:2023-11-04 02:28:05 27 4
gpt4 key购买 nike

我正在使用来自 euronext.com 的 REST API ,为了更进一步,我需要验证服务器证书并通过模块请求发送我自己的客户端证书。

我已经用 curl 做了一些测试,.crt/.pem 文件都被接受了。

但是请求仍然在抛出:

DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): saturn-api-h.euronext.com
Traceback (most recent call last):
File "C:\python36\lib\site-packages\urllib3\contrib\pyopenssl.py", line 441, in wrap_socket
cnx.do_handshake()
File "C:\python36\lib\site-packages\OpenSSL\SSL.py", line 1806, in do_handshake
self._raise_ssl_error(self._ssl, result)
File "C:\python36\lib\site-packages\OpenSSL\SSL.py", line 1546, in _raise_ssl_error
_raise_current_error()
File "C:\python36\lib\site-packages\OpenSSL\_util.py", line 54, in exception_from_error_queue
raise exception_type(errors)
OpenSSL.SSL.Error: [('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')]

我尝试解决问题的方法:

  • 关注 requests documentation
  • 将请求模块更新到 2.18.4
  • 安装 pyOpenSSL 17.5.0
  • 检查 .crt/.pem 格式
  • curl 测试

工作 curl :

curl -i -vvv -X POST https://saturn-api-h.euronext.com/SaturnWebServices/rest/Authentication/AuthenticateUser -H "Content-Type: application/json" --cert ./client.crt --cacert ./digicert-full-chain.crt

如果有有效的授权 header ,它会返回 200 状态代码,没有它会返回 401“访问被拒绝!”。如果证书验证失败,它会重定向到 euronext.com状态码为 302。

有问题的 python:

endpoint = 'https://saturn-api-h.euronext.com/SaturnWebServices/rest/Authentication/AuthenticateUser'       
headers = { 'Content-Type': 'application/json', } #'Authorization': 'Basic <auth_string>',

r = requests.post(endpoint, headers = headers, verify = './digicert-full-chain.crt', cert = './client.crt')

证书:

  • digicert-full-chain.crt 包含来自 DigiCert 的完整链:

    • DigiCertAssuredIDRootCA.pem
    • DigiCertSHA2AssuredIDCA.pem
    • DigiCertSHA2SecureServerCA.pem
  • client.crt 包含我们的证书及其 key 。

为什么 curl 命令有效而 python 的请求模块却失败了?

有没有办法从请求模块显示完整的握手过程?

最佳答案

我自己解决了这个问题,整个链中缺少一个证书。

正在做 /usr/local/lib/python3.4/dist-packages/certifi/cacert.pem > certifi-digicert.pem; digicert-full-chain.pem >> certifi-digicert.pem并将生成的证书传递给验证参数有效。

附带说明一下,我使用 strace 命令比较了 python 和 curl 的证书位置:

  • strace <python_command> |& grep open | grep -E 'crt|pem'
  • strace <curl_command> |& grep open | grep -E 'crt|pem'

我还检查了 Wireshark 以获得完整的握手过程,pyOpenSSL 模块在服务器的证书请求后出现错误。 Alert (Level: Fatal, Description: Unknown CA) .

关于python - 请求模块抛出 OpenSSL.SSL.Error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49861597/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com