错误: SSL错误:sslv3握手故障警报

35

我正在向branch.io发起以下调用

import requests
req = requests.get('https://bnc.lt/m/H3XKyKB3Tq', verify=False)

它在我的本地机器上运行良好,但在服务器上失败。

SSLError: [Errno 1] _ssl.c:504: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

Openssl版本:

本地:OpenSSL 0.9.8zg,发布于2015年7月14日

服务器:OpenSSL 0.9.8e-fips-rhel5,发布于2008年7月1日

Python版本:

本地:2.7.10
服务器:2.7.6

Branch io服务器连接:

Chrome确认DigiCert SHA2 Secure Server CA颁发了该网站的证书。服务器没有提供任何证书透明信息。

我尝试使用urllib2,但结果还是一样。有人能帮助吗?


你需要至少 OpenSSL 0.9.8o 才能处理 sha256 证书,所以你的服务器版本太老了。 - Barry Pollard
我尝试了 OpenSSL 1.0.1e-fips 11 Feb 2013。它仍然给我相同的错误。 - Kumar Nitin
你的PHP是否使用了该版本的OpenSSL?请参考以下链接以获取检查方法:https://dev59.com/7GMl5IYBdhLWcg3wBzDy - Barry Pollard
它正在使用OpenSSL 1.0.0-fips 29 Mar 2010。 - Kumar Nitin
你正在使用6年前的软件来提供给用户一个“安全”的连接?也许你不应该提供SSL,以免提供虚假的安全感。请查看http://openssl.org/news/vulnerabilities.html。因此,这甚至不是一个问题,只需更新你的软件,并且唯一要考虑的版本是最近支持的版本。 - Nappy
显示剩余2条评论
2个回答

41

Jyo de Lys确定了问题。 问题描述在这里,解决方案在这里。 我采取以下措施使其正常工作:

  1. easy_install pyOpenSSL
  2. easy_install ndg-httpsclient
  3. easy_install pyasn1

如果您在使用urllib2时遇到此错误,则需要升级到python 2.7.9或更高版本。


我还需要执行以下命令:pip install pyasn1 以消除一些“subjectAltName check for SSL peer verification will be disabled”的警告,但除此之外完美无缺,让我省去了很多烦恼。 - Moby Duck
谢谢,我缺少了ndg-httpsclient! - David Underhill
如果这不能解决问题,可以尝试将pyOpenSSL修复到0.13版本。 - Félix
我在使用request包和Python 2.7.6 (Linux Mint 17.3)时遇到了同样的问题/错误,我按照这个答案操作后错误消失了。谢谢。 - Fabiano Tarlao
1
@Félix:你能描述一下你所说的“修复 pyOpenSSL 为0.13”,包括如何操作吗?你是指不允许使用0.13.1吗? - LarsH
但这个问题只存在于XAMPP中的nginx,其他地方不存在这个问题。 - Senior Pomidor

0

对于那些正在使用Python 3.9并遇到以下问题的人们 "SSL: SSLV3_ALERT_HANDSHAKE_FAILURE]" 在获取证书或特定URL的到期日期时

因此,您需要按照以下步骤才能从URL获得有效响应

  1. 在Windows中安装OpenSSL
  2. 现在复制OpenSSL的文件夹路径,该文件夹路径位于C驱动器中已安装的位置

使用以下代码

servers是URL列表 而ports是我这个案例中的所有端口列表

for i in range(0,len(servers)):
    try:
        s = servers[i]
        port = ports[i]
        print("querying {}".format(s))
        q = Popen(["C:\\Program Files\\OpenSSL-Win64\\bin\\openssl.exe", "s_client", "-connect","{}:{}".format(s,port),"-servername",s,"-showcerts" ], stdout=PIPE, stdin=PIPE, shell=False)
        y = check_output(["C:\\Program Files\\OpenSSL-Win64\\bin\\openssl.exe", "x509", "-noout", "-dates"], stdin=q.stdout)
        print(y.decode("utf-8"))
    except Exception as e:
        print(e) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接