当前位置: 首页 > 面试题库 >

Python Urllib2 SSL错误

黄毅
2023-03-14
问题内容

Python 2.7.9现在对SSL证书验证更加严格。太棒了!

对于以前运行的程序现在出现CERTIFICATE_VERIFY_FAILED错误,我并不感到惊讶。但是我似乎无法使它们正常工作(没有完全禁用证书验证)。

一个程序正在使用urllib2通过https连接到Amazon S3。

我将根CA证书下载到名为“ verisign.pem”的文件中,然后尝试以下操作:

import urllib2, ssl
context = ssl.create_default_context()
context.load_verify_locations(cafile = "./verisign.pem")
print context.get_ca_certs()
urllib2.urlopen("https://bucket.s3.amazonaws.com/", context=context)

即使根CA在第4行中正确打印,我仍然会收到CERTIFICATE_VERIFY_FAILED错误。

openssl可以很好地连接到该服务器。实际上,这是我用来获取CA证书的命令:

openssl s_client -showcerts -connect bucket.s3.amazonaws.com:443 < /dev/null

我拿了链中的最后一个证书,并将其放在PEM文件中,openssl看起来不错。这是带有以下内容的Verisign证书:

Serial number: 35:97:31:87:f3:87:3a:07:32:7e:ce:58:0c:9b:7e:da
Subject key identifier: 7F:D3:65:A7:C2:DD:EC:BB:F0:30:09:F3:43:39:FA:02:AF:33:31:33
SHA1 fingerprint: F4:A8:0A:0C:D1:E6:CF:19:0B:8C:BC:6F:BC:99:17:11:D4:82:C9:D0

有什么想法如何使它与启用验证一起工作吗?


问题答案:

总结关于问题原因的评论并更详细地解释实际问题:

如果检查OpenSSL客户端的信任链,则会得到以下信息:

 [0] 54:7D:B3:AC:BF:... /CN=*.s3.amazonaws.com 
 [1] 5D:EB:8F:33:9E:... /CN=VeriSign Class 3 Secure Server CA - G3
 [2] F4:A8:0A:0C:D1:... /CN=VeriSign Class 3 Public Primary Certification Authority - G5
[OT] A1:DB:63:93:91:... /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority

第一个证书[0]是服务器发送的叶证书。以下证书[1]和[2]是服务器发送的链式证书。最后一个证书[OT]是受信任的根证书,该证书不是由服务器发送的,而是位于受信任CA的本地存储中。链中的每个证书都由下一个证书签名,最后一个证书[OT]受信任,因此信任链已完成。

如果您通过浏览器(例如,使用NSS库的Google Chrome)检查信任链,则会获得以下链:

 [0] 54:7D:B3:AC:BF:... /CN=*.s3.amazonaws.com 
 [1] 5D:EB:8F:33:9E:... /CN=VeriSign Class 3 Secure Server CA - G3
[NT] 4E:B6:D5:78:49:... /CN=VeriSign Class 3 Public Primary Certification Authority - G5

服务器再次发送[0]和[1],但是[NT]是受信任的根证书。从对象的角度看,这就像连锁证书[2]一样,指纹表示证书是不同的。如果您仔细查看证书[2]和[NT],您会发现,证书内的公钥是相同的,因此[2]和[NT]均可用于验证[
1],因此可以用来建立信任链。

这意味着,尽管服务器在所有情况下都发送相同的证书链,但是有多种方法可以将链验证为受信任的根证书。如何完成此操作取决于SSL库和已知的受信任根证书:

                          [0] (*.s3.amazonaws.com)
                           |
                          [1] (Verisign G3) --------------------------\
                           |                                          |
      /------------------ [2] (Verisign G5 F4:A8:0A:0C:D1...)         |
      |                                                               |
      |              certificates sent by server                      |
 .....|...............................................................|................
      |              locally trusted root certificates                |
      |                                                               |
     [OT] Public Primary Certification Authority        [NT] Verisign G5 4E:B6:D5:78:49
     OpenSSL library                                    Google Chrome (NSS library)

但是问题仍然是,为什么您的验证不成功。您所做的就是获取浏览器使用的受信任的根证书(Verisign G5
4E:B6:D5:78:49)和OpenSSL。但是在浏览器(NSS)和OpenSSL中的验证工作略有不同:

  • NSS:根据服务器发送的证书建立信任链。当我们获得由任何本地信任的根证书签名的证书时,停止构建链。
  • OpenSSL_根据服务器发送的证书构建信任链。完成此操作后,检查我们是否有可信的根证书对链中的最新证书进行签名。

由于存在这种细微的差异,OpenSSL无法针对根证书[NT]来验证链[0],[1],[2],因为该证书不会对链[2]中的最新元素进行签名,而是对[1]进行签名。如果html" target="_blank">服务器只发送了[0],[1]链,则验证将成功。

这是一个众所周知的错误,并且存在补丁,并且希望通过引入该X509_V_FLAG_TRUSTED_FIRST选项最终在OpenSSL
1.0.2中最终解决该问题。



 类似资料:
  • 我正在尝试搜索亚马逊的产品广告,并使用botlenose来帮助我做到这一点。但是,我刚刚收到HTTP错误400。 其他一些重要信息: 我来自巴西,我的标签也来自亚马逊。这是个问题吗? 我确实检查了我的钥匙、秘密和标签,一切正常。我确实在StackOverflow上查看了其他一些问题,但对我来说没有任何效果。 当然,出于安全原因,我更改了密钥。 Traceback(最近一次调用最后一次):File"

  • 我有一个基于Spring Web model view controller(MVC)框架的项目。Spring Web模型-视图-控制器(MVC)框架的版本是3.2.8 我有这个控制器 这个URL一切正常:

  • 目前从Angular JS controller中,我试图将JSON数据发送到后端服务。但是我有400个错误的请求错误。 在Controller中,我试图通过http服务发送数据,如下所示:

  • 我得到了这个错误,有什么想法会导致它吗?我试图发送一个DTO,它有一个扩展抽象类的对象列表,我想这个问题可能是因为DTO中的列表,还是因为抽象类的子类?

  • 在月食中, ”org.apache.axis2。AxisFault:传输错误: 403错误:禁止”试图从svn检出项目时发生错误。我不能实现这个错误,因此我检查了从终端使用"svn-co"命令的项目。 但是,有趣的是,当我试图在Eclipse中运行应用程序时,在输入凭据(用户名和密码)并按下“登录”按钮之后,我又遇到了相同的错误。响应是JFrame上的无效用户名/密码,但凭据没有错误。这只发生在日

  • Errors 错误 Library routines must often return some sort of error indication to the caller. As mentioned earlier, Go’s multivalue return makes it easy to return a detailed error description alongside th

  • 本章概述了Google API错误模型,以及开发人员如何正确生成和处理错误的一般指南。 Google API使用简单的协议无关错误模型,这使我们能够在不同的API,API协议(如gRPC或HTTP)以及错误上下文(例如,异步,批处理或工作流错误)中获得一致的体验。 错误模型 错误模型在逻辑上由google.rpc.Status定义,当API发生错误时,返回一个Status实例给客户端。 以下代码段

  • 5.4. 错误 在Go中有一部分函数总是能成功的运行。比如strings.Contains和strconv.FormatBool函数,对各种可能的输入都做了良好的处理,使得运行时几乎不会失败,除非遇到灾难性的、不可预料的情况,比如运行时的内存溢出。导致这种错误的原因很复杂,难以处理,从错误中恢复的可能性也很低。 还有一部分函数只要输入的参数满足一定条件,也能保证运行成功。比如time.Date函数