请求模块抛出 OpenSSL.SSL.Error

2024-02-29

我正在使用来自的 REST API泛欧交易所网站 http://www.euronext.com,要进一步,我需要验证服务器证书并通过模块请求发送我自己的客户端证书。

我已经用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')]

我所做的尝试解决这个问题:

  • 跟着请求文档 http://docs.python-requests.org/en/master/user/advanced/#ssl-cert-verification
  • 将请求模块更新至2.18.4
  • 安装 pyOpenSSL 17.5.0
  • 检查 .crt/.pem 格式
  • 卷曲测试

工作卷曲:

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

如果有有效的授权标头,它会返回 200 状态代码,如果没有,则会返回 401“访问被拒绝!”。如果证书验证失败,则重定向到泛欧交易所网站 http://www.euronext.com状态码为 302。

有问题的蟒蛇:

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-全链.crt包含来自 DigiCert 的完整链:

    • DigiCertAssuredIDRootCA.pem
    • DigiCertSHA2AssuredIDCA.pem
    • DigiCertSHA2SecureServerCA.pem
  • 客户端.crt包含我们的证书及其密钥。

为什么curl 命令可以工作,而python 的requests 模块却失败?

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


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

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

附带说明一下,我使用 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).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

请求模块抛出 OpenSSL.SSL.Error 的相关文章

随机推荐

  • 将 HTML 返回到 AJAX Rails 调用

    读完大卫 海涅迈尔 汉森之后博客文章 https 37signals com svn posts 3697 server generated javascript responses关于服务器生成的 javascript 我决定回顾一下在
  • 将表达式传递给 NHibernate 中的方法会导致“ConstantExpression”类型的对象无法转换为“LambdaExpression”类型

    这个问题在 NHibernate 2 和 3 中都会出现 我有一个类 A 它有一个类 B 的成员集 直接查询类可以很好地执行 但是当我将涉及类 B 的表达式之一传递到方法中时 出现以下错误 System ArgumentException
  • Airflow - 分支连接运算符

    我正在尝试加入 Airflow 中的分支操作员 我这样做了 op1 gt gt op2 op3 op4 op2 gt gt op5 op3 gt gt op6 op4 gt gt op7 op5 op6 op7 gt gt op8 它给出了
  • 涉及异步调用时,如何设置具体的执行顺序?

    我是 JavaScript 世界的新手 2 天 我之前唯一的编码经验是 Java 其中语句的执行是按顺序进行的 我明白 或者至少我读过 JavaScript 是异步的 这意味着如果有一个语句需要很长时间才能执行 则执行下一个语句 而不会阻止
  • 您是否混淆过您的商业 Java 代码? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想知道是否有人在他自己的商业产品上使用商业 免费的 java 混淆器 我只知道一个项目在发布的 ant 构建步骤中实际上有一个令人困惑的步骤
  • 如何访问conda环境.yml中预定义的环境变量?

    我希望与其他人共享一个environment yml 文件 以重现与我相同的设置 我们使用的代码取决于环境变量 PWD 我希望在environment yml 中设置一个新的环境变量 我可以在其中访问 PWD 例如 我能够做到 variab
  • 继承层次:构造函数和析构函数的执行顺序

    Here http www parashift com c faq lite multiple inheritance html http www parashift com c faq lite multiple inheritance
  • 在Python中使用lambda表达式在循环内生成函数[重复]

    这个问题在这里已经有答案了 如果我制作两个函数列表 def makeFun i return lambda i a makeFun i for i in range 10 b lambda i for i in range 10 为什么要列
  • 空合并运算符的右结合如何表现?

    空合并运算符是右结合的 这意味着以下形式的表达式 第一的 第二 第三 被评估为 第一的 第二个 第三个 根据上述规则 我认为以下翻译是不正确的 From Address contact user ContactAddress if cont
  • MSBuild 运行单元测试

    我正在尝试配置 CruiseControl net 以定期构建我们的存储库代码并运行解决方案中包含的测试 我已经配置了从 svn 服务器和构建部分检索代码 但我无法对其进行测试 MSBuild 一直在抱怨这一点 错误 MSB4057 目标
  • 读取特定 Parquet 列时,将读取所有列而不是 Parquet-Sql 中给出的单个列

    我在 Parquet Documentation 中读到 只有我查询的列 才会读取并处理该列的数据 但是当我看到 Spark UI 时 我发现完整的文件已被读取 以下是编写 parquet 文件并在 Spark Sql 中读取的代码 obj
  • 具有多索引的 df.at 与 df.loc

    我有一个关于之间差异的问题df loc and df at关于具有多重索引的数据帧 我一直在 stackoverflow 上查看一些精彩的资源 但它似乎并没有阐明我的问题 尤其是这个 熊猫 at 与 loc https stackoverf
  • libcurl 中是否有可用的压缩

    我需要使用 libcurl 和 C 将一个大文件从本地计算机传输到远程计算机 libcurl 是否有内置可用的压缩选项 由于要传输的数据很大 大小为 100 MB 到 1 GB 如果 libcurl 本身提供此类选项会更好 我知道我们可以压
  • 如何在 Python/ElementTree 中输出 XML 声明

    我正在尝试为 XML 格式的单词参考源文件创建一个 XML 文件 当我写入文件时 仅显示 xml decation True 但我想要它的形式 from xml etree ElementTree import ElementTree fr
  • PHP 如果“id”为 null 则移动到 url

    需要以下代码的帮助 我有一个提供 id 的表单 提交时下一个脚本从数据库获取数据 如果由于某种原因 id 为零 我如何将网址转发到我的 404 页面 Code id GET id include dbconnection php inclu
  • C++ 结构“placement new”有什么用途?

    我刚刚了解了名为 placement new 的 C 结构 它允许您精确控制指针在内存中指向的位置 它看起来像这样 include
  • EF插入多个相关表

    我正在尝试使用 Linq Entity Framework 将数据从 C 应用程序保存到数据库中 插入到单个表很简单 但我不知道如何将数据插入到三个表中 这三个表都通过自增标识互连 这是为了刮擦 所以我正在拿一个线程及其所有帖子 每个话题标
  • HtmlButton 处理程序在单击时触发两次(当 AutoEventWireup="True" 时)

    我有一个 html 按钮 见下文 当单击并且 AutoEventWireup true 时 Save Click 单击处理程序将被触发两次 当 AutoEventWireup False 时 它会触发一次 为什么会发射两次 该按钮没有注册两
  • JS 编译过程中的参考错误与语法错误

    我正在对解释与编译进行一些研究 成立本文 https almogad medium com javascript is it compiled or interpreted 9779278468fc其中指出 console log Hell
  • 请求模块抛出 OpenSSL.SSL.Error

    我正在使用来自的 REST API泛欧交易所网站 http www euronext com 要进一步 我需要验证服务器证书并通过模块请求发送我自己的客户端证书 我已经用curl做了一些测试 crt pem文件都被接受了 但请求仍然抛出 D