解决Python报错问题[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE]

yizhihongxing

当使用Python中的requests库或其他HTTP库时,如果遇到SSL协议的问题,会导致程序抛出报错,例如[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE]。此时,我们需要检查SSL协议是否有问题,并采取一些措施来修复这个问题。

以下是完整攻略:

1. 确定问题来源

在开始解决问题之前,我们需要确定是否是SSL协议的问题导致了程序报错。为了检查SSL协议是否正常工作,我们可以使用 OpenSSL 工具来测试。

可以使用以下命令测试SSL协议是否工作正常:

openssl s_client -connect url:port

如果我们得到以下输出,则证明SSL协议存在问题:

CONNECTED(00000003)
140735717325616:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:769:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 289 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

2. 确认SSL协议版本

如果我们发现 SSL 协议确实是导致程序报错的原因,那么我们需要确认 SSL 协议版本是否支持。目前,Python requests 库默认使用的是 TLS(Transport Layer Security)协议,不再支持老旧的 SSLv3 协议。

可以使用以下方法查看requests库所使用的 SSL 协议版本:

import requests

print(requests.certs.where())  # SSL证书目录
print(requests.utils.DEFAULT_CA_BUNDLE_PATH)  # SSL 证书文件
print(requests.utils.HAS_SNI)  # 是否支持SNI
print(requests.utils.get_encodings_from_content(content))  # 解析content的编码
print(requests.utils.get_unicode_from_response(response))  # 解析response的编码

对于旧版requests库,可以使用以下代码获取使用的 SSL 协议版本:

print(requests.get('https://www.howsmyssl.com/a/check',verify=False).json()['tls_version'])

3. 更新 SSL 协议

如果我们需要使用 SSLv3 协议,则需要将 requests 库的默认 SSL 版本设置为 SSLv3。这可以通过以下代码实现:

import requests
import ssl

# 禁用所有SSL/TLS协议的证书验证
ssl._create_default_https_context = ssl._create_unverified_context
# requests库使用ssl3.0协议
requests.packages.urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST = 'TLSv1'

response = requests.get('https://')

4. 更新 requests 库

我们可以尝试更新 requests 库来解决问题,因为新版requests库在许多方面都得到了改进和更新,包括SSL协议和TLS协议的支持。

可以使用以下命令更新requests库:

pip install requests --upgrade

5. 略过 SSL 验证

在某些情况下,我们可以选择简单地略过 SSL 验证,直接请求数据。虽然这是一个比较危险的做法,但对于某些测试任务来说,可能是一个可行的解决方案。

可以使用以下代码略过 SSL 验证:

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

response = requests.get('https://',verify=False)

上述代码使用 verify=False 参数,禁用 SSL 验证。需要注意的是,这个方法仍然会产生警告,我们可以使用 requests.packages.urllib3.disable_warnings 函数来关闭这个警告。

示例说明

示例 1

如果我们使用了 requests 库,而且我们在使用 SSL 或 TLS 连接时遇到了 SSLv3 报错,那么可以使用以下代码来解决这个问题:

# 加载requests库
import requests
import ssl

# 禁用所有SSL/TLS协议的证书验证
ssl._create_default_https_context = ssl._create_unverified_context
# requests库使用ssl3.0协议
requests.packages.urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST = 'TLSv1'

response = requests.get('https://')

上述代码中,我们使用 ssl._create_unverified_context 来创建一个未经验证的SSL/TLS上下文,然后将其设置为当前默认上下文。

示例 2

如果我们需要使用更老旧的 SSLv2 协议,那么可以使用以下代码:

import requests
import ssl

# 禁用所有SSL/TLS协议的证书验证
ssl._create_default_https_context = ssl._create_unverified_context
# requests库使用ssl2.0协议
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ALL'
requests.packages.urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST = 'SSLv2'

response = requests.get('https://',verify=False)

上述代码中,我们使用 requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS 来设置所有密码套件,然后将 requests.packages.urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST 设置为 SSLv2。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决Python报错问题[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • Python字典实现简单的三级菜单(实例讲解)

    Python字典实现简单的三级菜单(实例讲解) 问题 在 Python 中如何实现简单的三级菜单? 解决方案 使用 Python 的字典结构,可以轻易地实现简单的三级菜单。 字典是 Python 中用于存储键值对的一种数据结构,可以用于快速查找和读取数据。可以将字典看作是一个无序的键值对列表,其中每个键都是唯一的,并且对应的值可以是任何数据类型。 在三级菜单…

    python 2023年5月13日
    00
  • Pandas日期处理之生成工作日与节假日

    我们来详细讲解一下“Pandas日期处理之生成工作日与节假日”的完整攻略。 一、背景介绍 在数据处理中,日期处理是一个非常重要的环节。Pandas是Python中用于数据处理的一个重要库,它提供了丰富的日期处理相关的功能。本文将介绍如何使用Pandas生成指定日期范围内的工作日与节假日。 二、生成指定日期范围内的工作日 要生成指定日期范围内的工作日,我们可以…

    python 2023年6月3日
    00
  • 如何在pycharm中快捷安装pip命令(如pygame)

    如何在PyCharm中快捷安装pip命令(如pygame): 打开PyCharm并创建一个新项目。在“File”菜单中,选择“New Project”,并按照提示完成项目的名称和所需的虚拟环境设置等信息。点击“Create”按钮,新项目就会被创建。 打开PyCharm的“Terminal”窗口。在PyCharm的底部工具栏中,可以找到一个名为“Termina…

    python 2023年5月14日
    00
  • 详解Python字符串切片

    详解Python字符串切片 在Python编程中,字符串是一种重要的数据类型,字符串切片是在字符串中提取部分内容的一种方法。本文将详细讲解Python字符串切片的语法、使用方法和示例。 切片语法 Python字符串切片使用的语法为: string[start:end:step] 其中,参数start表示切片开始位置的索引,end表示切片结束位置的索引(但不包…

    python 2023年6月5日
    00
  • 如何卸载 .exe 设置使用 Python 在控制面板中显示的已安装程序

    【问题标题】:How to Uninstall .exe setups Installed programs showing in control panel using Python如何卸载 .exe 设置使用 Python 在控制面板中显示的已安装程序 【发布时间】:2023-04-01 13:34:01 【问题描述】: 我浏览了这段代码,但这段代码仅适…

    Python开发 2023年4月8日
    00
  • 如何对python的字典进行排序

    在Python中,字典是一种无序数据类型,不过我们可以通过字典键或者值对字典进行排序。 下面是对Python字典进行排序的完整攻略: 对字典键进行排序 使用sorted()函数 # 定义一个字典 dict1 = {‘a’: 3, ‘b’: 1, ‘c’: 2} # 对字典的键进行排序 sorted_dict1 = dict(sorted(dict1.item…

    python 2023年5月13日
    00
  • python实现excel公式格式化的示例代码

    现在我来详细讲解一下“python实现excel公式格式化的示例代码”的完整实例教程。 什么是python实现excel公式格式化 在日常工作中,我们经常需要对excel表格进行各种操作,其中涉及到的公式也是必不可少的。因此,我们可以使用python编写程序来实现对excel公式的格式化。具体来讲,就是将表格中的公式以一定的格式输出,并且可以保留相应的公式运…

    python 2023年5月13日
    00
  • python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法

    要实现“python opencv 读取图片 返回图片某像素点的b,g,r值”的功能,可以按照以下步骤进行操作: 步骤一:安装OpenCV库 在命令行中使用以下命令安装OpenCV库: pip install opencv-python 步骤二:读取图片 在Python代码中使用以下语句读取图片: import cv2 # 读取图片 img = cv2.im…

    python 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部