下面是解决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]的攻略就介绍完毕了。