You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GitHub Actions中用Python Requests下载数据遇SSL错误求助

解决GitHub Actions中Python请求psp.cz的SSL重协商错误

问题原因

[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] 错误是因为目标服务器使用了旧版SSL重协商机制,而GitHub Actions默认的Ubuntu环境中,OpenSSL已默认禁用这种不安全的重协商方式,你的本地环境则因配置差异允许该操作。

解决方案

方案1:修改GitHub Actions环境的OpenSSL配置

在GitHub Actions的YML文件中添加步骤,全局修改OpenSSL配置以允许旧版重协商:

jobs:
  scheduled:
    runs-on: ubuntu-latest
    steps:
    # ... 保留原有步骤(代码检出、Python环境配置等) ...
    - name: Enable legacy SSL renegotiation
      run: |
        echo "Options = UnsafeLegacyRenegotiation" >> /etc/ssl/openssl.cnf
    - name: Download data
      run: python downloader.py
    # ... 保留后续步骤(数据处理、提交推送等) ...

方案2:在Python代码中自定义SSL上下文(推荐)

通过自定义requests的SSL适配器,仅针对当前请求启用旧版重协商支持,避免全局修改环境配置:
修改你的downloader.py代码:

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

class LegacySSLAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        ctx = ssl.create_default_context()
        # 启用旧版服务器连接支持(Python 3.10+支持)
        ctx.options |= ssl.OP_LEGACY_SERVER_CONNECT
        kwargs['ssl_context'] = ctx
        return super().init_poolmanager(*args, **kwargs)

url = "https://www.psp.cz/eknih/cdrom/opendata/poslanci.zip"
session = requests.Session()
session.mount("https://", LegacySSLAdapter())
r = session.get(url)

# 可选:保存下载的文件
with open("poslanci.zip", "wb") as f:
    f.write(r.content)

说明

  • 方案1的全局配置修改会影响整个GitHub Actions环境的所有SSL请求,适合多个请求都需兼容旧服务器的场景。
  • 方案2仅针对当前Python请求生效,安全性更高,是更推荐的做法(需Python 3.10及以上版本)。

内容的提问来源于stack exchange,提问作者Michal Skop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 15:35:28