本文最后更新于 2025-09-11,文章内容可能已经过时。

【解决】Httpx UNSAFE_LEGACY_RENEGOTIATION_DISABLED

0x01 前言

之前是用Python中的requests库出现了这个问题,当时几乎翻遍了网上的所有资料,都没有很好的解决这个问题,包括但不限于以下尝试

  • 添加openssl.cnf:这玩意儿好像有用,是需要手动加到环境里的,但是我写的程序需要分发,不太好搞,就pass了
  • 添加TLSAdapter:这个应该还是有点用,但是我后面换框架了,采用了另外一种方式,忘了当时这个是否有用了
  • 安装cryptography==36.0.2
  • 设置ssl._create_default_https_context = ssl._create_unverified_context

后面改用httpx了,刚开始用的时候也没问题,后面访问部分网站的时候又报UNSAFE_LEGACY_RENEGOTIATION_DISABLED这个错了,当时解决了没多想,然后最近写程序这玩意儿又蹦出来了,网上找了半天有没有很好的解决方案,于是翻了一下之前解决的代码,发现有用,贴出来做个记录。

0x02 HTTPX 解决代码

import httpx
import ssl

# 解决SSL报错
# 
ctx = ssl.create_default_context()  # 这两种ctx和下面3个协议排列组合,理论上来说,总有一种情况可通
# ctx = ssl._create_unverified_context()  


ctx.options |= ssl.PROTOCOL_TLSv1_2  # TLSv1.2  (如果这个不生效,把这一行注释,依次试一下下面几个)
# ctx.options |= ssl.PROTOCOL_TLSv1 # TLSv1
# ctx.options |= ssl.PROTOCOL_TLSv1_1  # TLSv1.1


client = httpx.Client(headers=header_xueba, verify=ctx, timeout=30.0)
client.get("https://www.baidu.com")