首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不安全的旧版重新协商禁用SSL错误

不安全的旧版重新协商禁用SSL错误
EN

Stack Overflow用户
提问于 2022-03-24 13:22:32
回答 4查看 24K关注 1票数 20

我正在运行Python代码,其中必须从HTTPSConnectionPool(host='ssd.jpl.nasa.gov',port=443)获取一些数据。但是每次我试图运行代码时,我都会得到以下错误。我在MAC操作系统12.1上

代码语言:javascript
运行
复制
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='ssd.jpl.nasa.gov', port=443): Max retries exceeded with url: /api/horizons.api?format=text&EPHEM_TYPE=OBSERVER&QUANTITIES_[...]_ (Caused by SSLError(SSLError(1, '[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled (_ssl.c:997)')))

我真的不知道如何绕过这个问题..。谢谢你的帮助!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-05-25 08:48:48

当使用OpenSSL 3连接到不支持它的服务器时,会出现此错误。解决方案是降低python中的加密包的级别:

在使用过的环境中运行pip install cryptography==36.0.2

来源:https://github.com/scrapy/scrapy/issues/5491

编辑:参考Hally Mallon和阿姆卡拉的答案,在不降低密码学等级的情况下修复

票数 12
EN

Stack Overflow用户

发布于 2022-05-15 03:55:16

CVE-2009-3555.警告:当启用遗产不安全重新协商时,SSL连接将容易受到中描述的中间人前缀攻击的攻击。

借助https://bugs.launchpad.net/bugs/1963834https://bugs.launchpad.net/ubuntu/+source/gnutls28/+bug/1856428

请注意,不建议编辑系统的openssl.conf,因为一旦openssl更新,您可能会丢失更改。

在任何目录中创建一个具有以下内容的自定义openssl.cnf文件:

代码语言:javascript
运行
复制
openssl_conf = openssl_init

[openssl_init]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
Options = UnsafeLegacyRenegotiation

在运行程序之前,请确保在运行刮板时将OPENSSL_CONF环境变量设置为自定义openssl.cnf完整路径,如下所示:

代码语言:javascript
运行
复制
OPENSSL_CONF=/path/to/custom/openssl.cnf python your_scraper.py

大概是这样的:

代码语言:javascript
运行
复制
export OPENSSL_CONF=/path/to/custom/openssl.cnf
python your_scraper.py

或者,如果您正在使用pipenv、systemd或docker,请将其放入您的.env文件中。

代码语言:javascript
运行
复制
OPENSSL_CONF=/path/to/custom/openssl.cnf
票数 37
EN

Stack Overflow用户

发布于 2022-03-28 10:58:31

我在Linux上也遇到了同样的错误(当服务器不支持"RFC 5746安全重新协商“而客户端使用OpenSSL 3 (默认情况下强制执行该标准)时就会发生这种情况)。

这里有一个解决方案(您可能需要稍微调整一下)。

  1. 在Python代码中导入sslurllib3
  2. 创建一个使用自定义ssl Context的自定义Context
代码语言:javascript
运行
复制
class CustomHttpAdapter (requests.adapters.HTTPAdapter):
    '''Transport adapter" that allows us to use custom ssl_context.'''

    def __init__(self, ssl_context=None, **kwargs):
        self.ssl_context = ssl_context
        super().__init__(**kwargs)

    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = urllib3.poolmanager.PoolManager(
            num_pools=connections, maxsize=maxsize,
            block=block, ssl_context=self.ssl_context)
  1. 设置一个启用sslOP_LEGACY_SERVER_CONNECT上下文,并与您的自定义适配器一起使用。

ssl.OP_LEGACY_SERVER_CONNECT在Python中还不可用(https://bugs.python.org/issue44888)。但是,在OpenSSL中,它在位字段中的值是0x4。这样我们就可以做下面的事。

代码语言:javascript
运行
复制
ctx = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
ctx.options |= 0x4
session.mount('https://', CustomHttpAdapter(ctx))
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71603314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档