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

  • Post category:Python

下面是解决Python报错问题[SSL:SSLV3_ALERT_HANDSHAKE_FAILURE]的完整攻略。

1. 问题分析

当你使用Python进行网络请求(如使用requests库)时,可能会出现以下错误:

requests.exceptions.SSLError: HTTPSConnectionPool(host='xxx', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:727)'),))

这个问题的原因是请求的网站使用了过时的安全协议SSLv3,而Python默认使用的是更强大的TLSv1.0及以上的安全协议。

2. 解决方案

2.1 方案一:禁用SSL验证

如果你的程序仅仅是需要获取网页的内容而不是进行敏感操作,可以考虑禁用SSL验证。这样做虽然可以解决问题,但同时也会带来一些安全风险,因此需在仔细评估后决定是否使用。

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

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
response = requests.get("https://xxx", verify=False)

通过上述代码,在requests库中禁用SSL验证即可,其中InsecureRequestWarning可选,表示去掉警告提示,verify=False表示关闭校验。

2.2 方案二:手动指定安全协议版本

如果你需要在请求中使用SSL验证,可以手动指定使用的安全协议版本,这样可以让Python与请求网站使用相同的协议,从而避免报错。

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
import ssl

class MyAdapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(
            num_pools=connections,
            maxsize=maxsize,
            block=block,
            ssl_version=ssl.PROTOCOL_SSLv3)

session = requests.session()
session.mount('https://', MyAdapter())
response = session.get("https://xxx")

通过上述代码,手动指定使用的安全协议版本即可,其中ssl.PROTOCOL_SSLv3可换成其他版本。

3. 示例说明

3.1 示例一:禁用SSL验证

比如你需要获取一个自签名证书的网站的内容,可以通过禁用SSL验证进行请求。

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

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
response = requests.get("https://xxx", verify=False)
print(response.content.decode())

3.2 示例二:手动指定安全协议版本

比如你需要访问一个SSLv3协议的网站,可以通过手动指定使用SSLv3协议进行请求。

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
import ssl

class MyAdapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(
            num_pools=connections,
            maxsize=maxsize,
            block=block,
            ssl_version=ssl.PROTOCOL_SSLv3)

session = requests.session()
session.mount('https://', MyAdapter())
response = session.get("https://xxx")
print(response.content.decode())

至此,完整的解决Python报错问题[SSL:SSLV3_ALERT_HANDSHAKE_FAILURE]的攻略就介绍完毕了。