在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
相关产品推荐
相关产品推荐

