urllib https请求报错 urlerror: 通常因ssl证书验证失败、网络连接问题或目标服务器不可达导致,需检查证书配置、代理设置及url有效性。

urllib HTTPS请求报错 URLError: <urlopen error certificate_verify_failed></urlopen>
这是 Python 3.7+ 默认启用 SSL 证书验证后的典型表现,不是代码写错了,而是系统缺少可信 CA 证书或环境未正确配置。别急着关验证——先确认是不是真要绕过。
检查系统 CA 证书路径是否被识别
Python 的 ssl 模块依赖操作系统或内置的 CA 证书包。常见问题:macOS 上用 pyenv 或 conda 安装的 Python 可能找不到系统钥匙串;Linux 容器里没装 ca-certificates;Windows 上某些 Python 打包版本(如 PyInstaller)没嵌入证书。
- 运行
python -c "import ssl; print(ssl.get_default_verify_paths())",看cafile路径是否存在且可读 - 若
cafile为空或指向不存在的文件,说明证书源缺失 - Linux:安装
ca-certificates(apt-get install ca-certificates或yum install ca-certificates) - macOS:重装 Python 时加
--with-openssl,或手动设置环境变量SSL_CERT_FILE=/etc/ssl/cert.pem
临时调试:只对特定域名禁用证书验证(不推荐上线)
仅用于本地开发排查网络或服务端证书配置问题。永远不要在生产环境用 context=ssl._create_unverified_context()。
import urllib.request import ssl <p>url = "<a href="https://www.php.cn/link/15898a944e35c6a3090e3790aa35a5ae">https://www.php.cn/link/15898a944e35c6a3090e3790aa35a5ae</a>" req = urllib.request.Request(url) context = ssl._create_unverified_context() response = urllib.request.urlopen(req, context=context) </p>
- 注意:
ssl._create_unverified_context()是私有 API,可能在后续 Python 版本中移除 - 不能只传
context给urlopen就完事——必须确保Request对象没带其他干扰头(比如某些代理会重写 HTTPS 请求) - 如果用了
urllib.request.build_opener(),需在 opener 上统一设置 handler,而不是单次请求
更稳妥的替代方案:换用 requests 并显式指定证书
urllib 对证书管理太底层,出问题难定位。实际项目中,直接用 requests 更可控:
import requests
# 使用系统默认证书
r = requests.get("https://www.php.cn/link/15898a944e35c6a3090e3790aa35a5ae")
<h1>指向自定义证书路径(比如公司内网根证书)</h1><p>r = requests.get("<a href="https://www.php.cn/link/332c20b03c6a26cdd95a080e7d435ce4">https://www.php.cn/link/332c20b03c6a26cdd95a080e7d435ce4</a>", verify="/path/to/company-root.crt")</p><h1>关闭验证(仅调试)</h1><p>r = requests.get("<a href="https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635">https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635</a>", verify=False)
</p>
-
requests默认复用certifi包,更新证书只需pip install --upgrade certifi -
verify参数支持布尔值、路径字符串,比urllib的context更直观 - 若服务端用的是自签名或私有 CA 证书,把根证书文件路径传给
verify=,比改系统级配置安全得多
证书验证失败的本质,往往不是 Python 的锅,而是环境没连上可信证书源。强行关验证容易掩盖真实问题,比如中间人攻击或服务端证书配置错误。真正要花时间的,是搞清证书链从哪来、该信谁。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











