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

当使用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 asyncio的一个坑

    Python asyncio的一个坑 在使用Python的asyncio库进行异步编程时,有一个常见的坑点是在协程中使用了阻塞式的同步代码,这会导致整个事件循环被阻塞,从而影响程序的性能和响应速度。以下是详细解“Python asyncio的一个坑”的完整攻略。 问题描述 在Python的asyncio库中,我们通常使用async/await关键字来定义协程…

    python 2023年5月13日
    00
  • python如何去除字符串中不想要的字符

    下面是Python如何去除字符串中不想要的字符的完整攻略: 步骤1:确定要去除的字符类型 字符串中的字符类型很多,比如空格、制表符、换行符、标点符号等等。在使用Python去除字符串中不想要的字符之前,需要先确定需要去除哪一种或哪几种字符类型。 步骤2:使用字符串方法去除字符 Python的字符串类型有很多有用的方法,可以用来去除字符串中不想要的字符。在这里…

    python 2023年6月5日
    00
  • python pandas 如何替换某列的一个值

    首先,我们需要明确两个概念,分别是Series和Dataframe。Series代表一列数据,而Dataframe则代表了多列数据按照一定规则整合的结果。 要替换某列的一个值,我们必须使用到Dataframe的loc函数。loc函数可以通过行、列索引来找到对应数据,并进行更新。以下是详细步骤: 先导入pandas库,并构造一个含有多列数据的Dataframe…

    python 2023年6月6日
    00
  • python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py

    首先,报错信息中的 import numpy as np 是在导入 NumPy 库,所以我们需要先安装好 NumPy 库。可以使用 pip 命令(Python 自带的包管理工具)进行安装: pip install numpy 如果已经安装过,可以升级到最新版本: pip install –upgrade numpy 安装完成后,在 Python 代码中使用…

    python 2023年5月13日
    00
  • 使用Java servlet实现自动登录退出功能

    自动登录和退出功能是现代Web应用程序及网站中常见的基础功能。Java servlet是一种常用的Web应用程序技术,可以实现这种功能。 实现自动登录退出功能需要对Java servlet中的会话管理机制、Cookie机制、数据库操作等知识有一定的了解。 以下是使用Java servlet实现自动登录退出功能的完整攻略: 1. 登录功能实现 1.1 创建登录…

    python 2023年6月3日
    00
  • 浅谈python下tiff图像的读取和保存方法

    浅谈Python下TIFF图像的读取和保存方法 在Python中,我们可以使用多种库来读取和保存Tiff格式的图像文件,如Pillow、OpenCV等。下面将分别介绍这些库的使用方法。 使用Pillow库 读取TIFF图像 读取TIFF格式的图像文件,我们可以使用Pillow库的Image.open()方法。示例代码如下: from PIL import I…

    python 2023年5月18日
    00
  • Python中有哪些常用的框架?

    Python语言是一个非常流行的编程语言,它在Web开发、数据科学、人工智能等领域都有着广泛的应用。Python生态系统中有许多强大的框架,用于开发Web应用、数据科学、机器学习等领域,这些框架让开发人员可以轻松地构建复杂的应用程序。本文将介绍Python中几个常用的框架。 Flask框架 Flask框架是一个轻量级的Web框架,它使用Python语言编写,…

    python 2023年4月19日
    00
  • 基于Python实现Hash算法

    下面是关于“基于Python实现Hash算法”的完整攻略。 1. Hash算法简介 Hash算法是一种将任意长度消息压缩到某一固定长度的算法。Hash算法的主要应用包括数据加密、数字签名、数据完整性校验等。常见的Hash算包括MD5、SHA-1、SHA-256等。 2. Python实现Hash算法 在Python中,我们可以使用 hash 模块来实现Has…

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