使用Python requests.get()时出现SSL证书错误该如何修复?
问题描述
运行如下Python requests请求代码:
reqs = requests.get('http://test.com')
返回SSL相关报错:
SSLError: HTTPSConnectionPool(host='test.com', port=443): Max retries exceeded with url: /?q=test.org (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)')))
已尝试执行以下修复命令,均未解决问题:
pip install python-certifi-win32 pip install --upgrade certifi
解决方案
按优先级从高到低尝试,优先选择安全合规的方案,临时规避方案不推荐在生产环境使用:
方案1:手动指定CA证书路径
升级certifi、安装python-certifi-win32无效,通常是因为你处于Windows域环境、使用了公司/机构自签根证书,或者开启了Fiddler/Charles等抓包工具,requests默认读取的certifi内置证书库不会包含这些自定义根证书,直接在请求中指定对应证书路径即可:import requests # Windows系统默认CA证书路径 ca_path = "C:/Windows/System32/curl-ca-bundle.crt" # macOS系统替换为 "/etc/ssl/cert.pem" # Linux系统替换为 "/etc/ssl/certs/ca-certificates.crt" # 如果是抓包场景,替换为你导出的抓包工具根证书pem文件路径即可 reqs = requests.get('http://test.com', verify=ca_path)方案2:修复MacOS系统Python证书关联(仅适用于Mac设备)
如果你的运行环境是MacOS,官网安装的Python或系统自带Python经常出现证书未关联系统钥匙串的问题,直接执行对应Python版本目录下的证书安装脚本即可:# 将路径中的3.10替换为你本地实际安装的Python版本号 cd /Applications/Python\ 3.10/ ./Install\ Certificates.command方案3:排查目标站点证书配置问题
你代码中请求的是HTTP协议地址,但报错显示请求被自动跳转到了443端口的HTTPS地址,说明目标站点配置了强制HTTPS跳转。如果以上方法都无效,可以手动检查目标站点的HTTPS证书是否存在中间证书缺失、证书域名不匹配、证书过期、证书链不完整的问题。方案4:临时关闭证书校验(仅本地调试用)
如果只是本地临时测试、明确知晓目标站点安全性,可以直接关闭证书校验逻辑,同时关闭冗余警告:import requests import urllib3 # 关闭不安全请求的警告提示 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) reqs = requests.get('http://test.com', verify=False)
注意:关闭证书校验会带来中间人攻击风险,绝对不能在生产环境、公网业务场景下使用。
内容的提问来源于stack exchange,提问作者Astro_Scientist97
相关产品推荐
相关产品推荐

