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

Python 3.6中urllib报SSL: CERTIFICATE_VERIFY_FAILED错误的排查与解决

问题分析与解决:urllib SSL: CERTIFICATE_VERIFY_FAILED (Python 3.6)

先给你吃个定心丸:这个错误不是urllib模块本身有异常,而是Python 3.6的SSL证书验证机制在特定环境下触发的正常校验失败。下面给你拆解原因和对应的修复方案:

为什么会出现这个错误?

核心原因是Python 3.6默认开启了严格的SSL证书验证,当以下任一情况发生时,就会抛出SSL: CERTIFICATE_VERIFY_FAILED:

  • 目标网站的SSL证书过期、无效,或者是不被公共根证书信任的自签名证书
  • 你的Python 3.6环境缺少完整的根证书库(比如MacOS上手动安装的Python,默认没装根证书)
  • 网络环境存在代理或防火墙,篡改了目标网站的SSL证书(比如公司内网的透明代理)

修复方案(按安全性从高到低排序)

1. 补全本地根证书库(推荐,最安全)

如果是MacOS上的Python 3.6,大概率是默认没有安装根证书。你可以直接运行Python自带的证书安装脚本:

# 替换成你Python 3.6的实际路径,默认路径参考如下
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Applications/Python\ 3.6/Install\ Certificates.command

运行完成后,Python会更新系统根证书库,之后访问合法的HTTPS网站就不会再报错了。

2. 临时跳过证书验证(仅用于测试/非敏感场景)

如果你只是临时调试,或者访问的是自己搭建的自签名证书服务,可以关闭证书验证。注意:这个方法会让请求失去SSL安全保护,绝对不要在生产环境使用。

示例代码:

import urllib.request
import ssl

# 创建不验证SSL证书的上下文
ssl_ctx = ssl.create_default_context()
ssl_ctx.check_hostname = False
ssl_ctx.verify_mode = ssl.CERT_NONE

# 用这个上下文发起请求
with urllib.request.urlopen("https://your-test-site.com", context=ssl_ctx) as resp:
    content = resp.read()

3. 指定自定义根证书(适合内网/自签名场景)

如果目标网站使用的是内网CA颁发的证书或自签名证书,你可以把证书文件(.pem格式)加载到请求上下文中:

import urllib.request
import ssl

# 加载自定义证书文件
ssl_ctx = ssl.create_default_context(cafile="/path/to/your/ca-cert.pem")

# 发起请求
with urllib.request.urlopen("https://your-internal-site.com", context=ssl_ctx) as resp:
    content = resp.read()

4. 排查网络代理影响

如果你在公司/学校内网,可能是代理服务器替换了SSL证书。这种情况下,你需要把代理的CA证书添加到Python根证书库(参考方案1的思路),或者用方案3指定代理证书。另外,也可以检查是否有HTTP_PROXY/HTTPS_PROXY环境变量干扰,必要时临时取消代理设置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:16:01