python 请求特定 SNI 证书的“证书验证失败”

2024-04-15

多年来我一直在几乎所有项目中使用 python requests 框架,但还没有遇到过这样的问题。

这只发生在网站上www.pagedna.com据我所知。要重现的代码示例非常简单

import requests
requests.get("https://www.pagedna.com")

Chrome/Firefox 浏览器打开此网站,没问题,但上面的代码片段给了我通用 SSL 失败异常

Traceback (most recent call last):
  File "inline.py", line 2, in <module>
    requests.get("https://www.pagedna.com")
  File "/home/rishi/workspace/misc/venvs/mc3.4/lib/python3.4/site-packages/requests/api.py", line 75, in get
    return request('get', url, params=params, **kwargs)
  File "/home/rishi/workspace/misc/venvs/mc3.4/lib/python3.4/site-packages/requests/api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "/home/rishi/workspace/misc/venvs/mc3.4/lib/python3.4/site-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/rishi/workspace/misc/venvs/mc3.4/lib/python3.4/site-packages/requests/sessions.py", line 646, in send
    r = adapter.send(request, **kwargs)
  File "/home/rishi/workspace/misc/venvs/mc3.4/lib/python3.4/site-packages/requests/adapters.py", line 514, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.pagedna.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))

如果我使用 servername 参数,OpenSSL 会为我提供正确的信息

openssl s_client -showcerts -servername www.pagedna.com -connect www.pagedna.com:443

CONNECTED(00000003)
---
Certificate chain
 0 s:/OU=Domain Control Validated/CN=*.pagedna.com
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
-----BEGIN CERTIFICATE-----
MIIGrjCCBZagAwIBAgIJAJdLy96ULpdIMA0GCSqGSIb3DQEBCwUAMIG0MQswCQYD
VQQGEwJVUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEa
MBgGA1UEChMRR29EYWRkeS5jb20sIEluYy4xLTArBgNVBAsTJGh0dHA6Ly9jZXJ0
cy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5LzEzMDEGA1UEAxMqR28gRGFkZHkgU2Vj
dXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTE4MDcyNzE4MzUyMloX
DTIwMDkyNTE3MTExMVowOzEhMB8GA1UECxMYRG9tYWluIENvbnRyb2wgVmFsaWRh
dGVkMRYwFAYDVQQDDA0qLnBhZ2VkbmEuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEAt6B/jE5FjTKWdEtNj8oRxzqlk5fGjBfYbsKjdPuSi0t6i0a8
lN9yVYLhLM988s3XXvcU8E9d30aQ51JDjxtkID9VP4z4x8E/fWjGpJZ/Nh1XMrSf
rmIZEXr+SZzUBp2dISIJKgmNNr3vVWS4BmViL7YXxvgZzGiZwQRACkoFdfGkkGcT
h1WOPIYf7nzxyasLvddSN5j6BU4XgiTpdlJSWofXFdMJBFfHoTyLUiH+stMzE4wU
gA+oxKzRqhDHJ+L393i2mv4y2FXiQ0InTqyKRGGuX8zmoPirHCRAmMItk9gmUoi+
/3nDVnUlIG6LOgcXylVbn22W5WXN4iwtZ8TCVwIDAQABo4IDOTCCAzUwDAYDVR0T
AQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDgYDVR0PAQH/
BAQDAgWgMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9jcmwuZ29kYWRkeS5jb20v
Z2RpZzJzMS04NTIuY3JsMF0GA1UdIARWMFQwSAYLYIZIAYb9bQEHFwEwOTA3Bggr

etc...

但是,如果缺少 -servername 选项,它会给我一个不同的证书,我怀疑这是这里的问题。

相关pip安装如下

pyOpenSSL==19.0.0
requests==2.21.0
requests-toolbelt==0.8.0

Using python3.4

这是请求框架错误吗?我应该打开错误报告还是我遗漏了什么?


...但是上面的代码片段给了我通用的 SSL 失败异常...

 ...'tls_process_server_certificate', 'certificate verify failed')],)",),))

实际上,这不是一般的 SSL 故障。它显然失败了,因为它无法验证证书。原因不是 SNI 与非 SNI 的比较,因为长期以来,SNI 在请求中默认使用。

原因是服务器配置错误。来自SSL实验室报告 https://www.ssllabs.com/ssltest/analyze.html?d=www.pagedna.com:

该服务器的证书链不完整。等级上限为 B。

 

Chrome/Firefox 浏览器打开该网站,没问题...

桌面浏览器通常可以成功解决这种类型的常见错误配置,例如通过缓存来自其他连接的中间证书并使用它们来填充证书链中缺失的部分。但是,如果您尝试使用新的配置文件(例如 Firefox),您将遇到相同类型的 SSL 问题。

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

python 请求特定 SNI 证书的“证书验证失败” 的相关文章

随机推荐

  • Java 中 C# ObservableCollection 的等效项

    我想知道是否存在一种数据结构 其行为类似于 ObservableCollection 几乎就像 C 中一样 能够采用某种类型 ex 在 C 中我可以说 ObservableCollection
  • 通过浏览器链接在代码中连接 teamviewer

    我有一个问题让我抓狂 我已经成功地将我的 teamviewer 会话从浏览器 uri 连接到我所需的远程资源 我通过在浏览器地址栏中使用以下 uri 命令来实现此目的 实际上 这是 html 中的按钮单击 teamviewer8 remot
  • SPARK SQL 中的相关子查询列不允许作为非相等谓词的一部分

    我正在尝试在 where 子句中编写一个子查询 如下所示 但我越来越 非等式谓词中不允许有相关列 SELECT holidays FROM SELECT s holidays s entity FROM transit t tt WHERE
  • Angular bootstrap ui 模式使用相同的控制器而不是新的控制器

    我正在使用 Angular Bootstrap ui 模态框 它说要为新控制器提供一个新的 modalInstance 我想使用与初始化模态框相同的控制器 我搜索但没有成功 我找到了此链接 但没有成功 如何在 Angular UI Boot
  • 使用 Linq 将列表框项值转换为 int

    我使用列表框显示数据库中表的内容 每个列表框项目都使用设置为友好名称的 Text 属性和设置为唯一 ID 列的 Value 属性进行填充 数据库结构可能类似于以下内容 CREATE TABLE GENERIC FRIENDLY NAME T
  • 独立于 Rails 在 HAML 文件中使用布局

    我的最终目标是创建几个静态 HTML 文件以交给其他人 但对于我的工作流程 我希望将 HAML 作为基本源文件 在这样做时 我希望至少在我这边能够干燥这个过程 现在我有很多页面最终将共享一个通用布局 我想知道如何合并这些布局 这是我当前的代
  • 在没有缓冲区的情况下将数据从 fstream 复制到 stringstream?

    无论如何 我可以从fstream 一个文件 到一个stringstream 内存中的流 目前 我正在使用缓冲区 但这需要双倍的内存 因为您需要将数据复制到缓冲区 然后将缓冲区复制到字符串流 直到删除缓冲区为止 数据都会在内存中复制 std
  • 使用 PHP SSH 连接到远程服务器

    我想做一个SSH使用 php 连接到远程服务器 我在 Linux CEntOS 上使用 php 5 3 到目前为止我所做的 connection ssh2 connect 192 168 1 22 22 ssh2 auth password
  • 使用 foreach 迭代对象列表

    我看到这样的说法 当在对象列表上使用 foreach 时 迭代的对象实例is not可编辑 但对象属性are可编辑 有人可以用一个简单的例子来演示上述内容吗 让我重新表述一下 因为我发现了两个版本的说法 也许这个说法更清楚 当对元素列表使用
  • .Net Core动态dbContext

    我有两个 DbContext 共享同一个存储库 以下是我现有的代码 启动 cs services AddDbContext
  • redshift 上 array_agg() 或 string_agg() 的替代方案

    我正在使用此查询来获取聚合结果 select bs string agg wbns from bag group by 1 我收到此错误 运行查询时出错 函数 string agg 字符变化 未知 不存在提示 没有函数与给定的名称和参数匹配
  • Hibernate/JPA中涉及继承时如何指定列名?

    我想我想在这里鱼和熊掌兼得 但我们会看看是否有一个合理的解决方案来满足我正在寻找的问题 我有一个 Spring Boot JPA Hibernate 应用程序 它将与 MySQL 作为其后备存储进行通信 我有几种情况 从 OOP 的角度来看
  • 带有问号的奇怪 C# 语法

    private enum E Week Mon 0 Tue 下面的代码是什么意思 E Week week null 是否等于下面的代码 的作用是什么 在这里签名 E Week week null 您的代码正在使用所谓的可空类型 http m
  • 在Python中查找模块的路径而不导入

    我见过几种通过首先导入模块来查找模块路径的方法 有没有办法在不导入模块的情况下做到这一点 Using pkgutil http docs python org library pkgutil html module gt gt gt imp
  • Java字符串内部表示

    我知道Java对String的内部表示是UTF 16 什么是java字符串表示 https stackoverflow com questions 9699071 what is the javas internal representio
  • 如何在 ng-template 中使用反应式表单

    我刚刚开始使用 Angular 4 我需要开发一个 CRUD 网格 用户可以在其中添加 编辑或删除行 在我的研究过程中 我发现这篇文章展示了如何创建网格以及操作 具有 CRUD 操作的 Angular 4 Grid http www dot
  • Angularjs $state 在新选项卡中打开链接

    我正在尝试使用 state go 函数实现 在新选项卡中打开链接 功能 如果有这样的东西那就太棒了 state go routeHere parameter1 parameter reload true newtab true or smt
  • Ansible Expect 模块无法匹配字符串/正则表达式脚本问题

    我正在尝试通过 Ansible 在 Vagrant 机器中自动安装脚本 我尝试了很多方法在网络上寻找解决方案 但文档和示例非常薄弱 我试图安装的脚本提示了我试图以编程方式回答的问题Ansible 期望模块 Ansible 任务 名称 运行
  • Apache Ignite - 执行器中的池大小

    我正在尝试使用基于集群的执行器服务 获取启用集群的执行器服务 ExecutorService exec ignite executorService 有没有办法设置执行程序服务池中的线程数 希望作业将以循环方式在集群中的每个节点中执行 Th
  • python 请求特定 SNI 证书的“证书验证失败”

    多年来我一直在几乎所有项目中使用 python requests 框架 但还没有遇到过这样的问题 这只发生在网站上www pagedna com据我所知 要重现的代码示例非常简单 import requests requests get h