Python错误集(一)之SSLError

本文介绍了解决使用Python Requests库时遇到的SSLError问题的方法。针对不同版本的Requests库提供了具体的解决方案,包括重新启用3DES支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python: 2.7
requests: 2.19.1

最近需要向第三方发送https请求爬取数据,需要绕过SSL,但是在此过程中发生了如下错误:

requests.exceptions.SSLError: (“bad handshake: SysCallError(-1, ‘Unexpected EOF’)”,)

原因:

Requests已经移除对3DES stream cipher的支持,但是Requests有一个默认的严格的TLS 配置.

解决方法:

对于requests v2.12.0以下版本:

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

class DESAdapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(num_pools=connections,
                                       maxsize=maxsize,
                                       block=block,
                                       ssl_version=ssl.PROTOCOL_TLSv1)
s = requests.Session()
s.mount('https://', DESAdapter())
r = requests.get('https://some-3des-only-host.com')
r.encoding = 'utf8'
print r.text

对于requests v2.12.0及其以上版本:

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.ssl_ import create_urllib3_context

# This is the 2.11 Requests cipher string, containing 3DES.
CIPHERS = (
    'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
    'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:'
    '!eNULL:!MD5'
)


class DESAdapter(HTTPAdapter):
    """
    A TransportAdapter that re-enables 3DES support in Requests.
    """
    def init_poolmanager(self, *args, **kwargs):
        context = create_urllib3_context(ciphers=CIPHERS)
        kwargs['ssl_context'] = context
        return super(DESAdapter, self).init_poolmanager(*args, **kwargs)

    def proxy_manager_for(self, *args, **kwargs):
        context = create_urllib3_context(ciphers=CIPHERS)
        kwargs['ssl_context'] = context
        return super(DESAdapter, self).proxy_manager_for(*args, **kwargs)

s = requests.Session()
s.mount('https://some-3des-only-host.com', DESAdapter())
r = s.get('https://some-3des-only-host.com/some-path')

参考:https://lukasa.co.uk/2017/02/Configuring_TLS_With_Requests/

### 问题分析 当尝试通过 `pip` 安装包时,如果遇到 SSL/TLS 连接失败的问题,通常是因为 Python 的安装环境中缺少必要的 OpenSSL 库支持。具体表现为无法验证 SSL 证书或建立安全连接[^1]。 此问题可能由以下几个原因引起: - **OpenSSL 缺失或未正确配置**:Python 需要依赖系统的 OpenSSL 或者其自带的 OpenSSL 来处理加密通信。 - **PyOpenSSL 冲突**:某些情况下,第三方库 PyOpenSSL 可能会干扰默认行为,导致异常[^2]。 - **Pip 版本不匹配**:使用的 Pip 版本与当前 Python 解释器版本不符也可能引发此类错误[^3]。 --- ### 解决方案 #### 方法:重新编译并安装带有 SSL 支持的 Python 确保在构建 Python 时启用了 OpenSSL 功能。可以通过以下命令检查是否已启用: ```bash python -c "import ssl; print(ssl.OPENSSL_VERSION)" ``` 如果没有返回任何有效信息,则说明当前环境下的 Python 不具备完整的 SSL 支持。此时可以按照如下步骤操作: 1. 确认系统上已经安装了最新的 OpenSSL 开发工具包(例如,在 Ubuntu 上运行 `sudo apt-get install libssl-dev`)。 2. 下载对应版本的 Python 源码,并手动编译安装: ```bash ./configure --with-openssl=/path/to/openssl make && sudo make altinstall ``` > 如果不想完全替换现有的 Python,默认推荐使用 `altinstall` 而不是普通的 `make install`。 #### 方法二:卸载冲突的 PyOpenSSL 并更新 Pip 有时 PyOpenSSL 的存在可能会破坏标准库中的 SSL 实现逻辑。因此建议先移除它再测试网络功能正常与否: ```bash pip3 uninstall pyopenssl ``` 之后升级到最新版 Pip 工具来修复潜在漏洞以及改进兼容性: ```bash pip3 install --upgrade pip setuptools wheel ``` 注意这里强调的是针对特定解释器路径调用相应版本号命名形式的指令][^[^23]。 #### 方法三:绕过 SSL 验证 (仅限临时调试) 对于开发阶段或者特殊场景下允许忽略远程服务器身份认证过程的话,可采用下面的方式强制关闭校验机制: ```python # 创建个无保护模式下的 session 对象实例化请求句柄 from urllib import request as req_handler, parse ctx = req_handler.HTTPSHandler(context=None) # None 表示禁用 TLS 握手流程 opener = req_handler.build_opener(ctx) response_data = opener.open('https://example.com').read() print(response_data.decode()) ``` 不过这种方法并不被提倡用于生产环境下长期部署解决方案之中[^4]。 --- ### 总结 上述三种方法分别适用于不同层次的需求——从基础架构调整至高级定制脚本编写都有所涉及。实际应用过程中应优先考虑前两种更为稳健可靠的途径解决问题;只有在非常必要的情况下才去触碰最后那条捷径路线。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值