问题描述
当使用 urllib.urlopen
或 socket
打开一个 HTTPS 链接时抛出如下异常:
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)>
原因
- OpenSSL 本地 CA 证书不存在。
解决方法
- 查看默认证书位置
import ssl
print(ssl.get_default_verify_paths())
执行结果:
DefaultVerifyPaths( cafile=None, capath='/usr/local/openssl-1.1.1/certs', openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/openssl-1.1.1/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/openssl-1.1.1/certs')
- 由结果可见,CA 文件不存在。
- 下载 CA 文件
将下载的 CA 文件放到
openssl_cafile
指定位置,并创建openssl_capath
指定目录mkdir /usr/local/openssl-1.1.1/certs # 切换到当前openssl目录,并下载ca文件 cd /usr/local/openssl-1.1.1/ wget http://curl.haxx.se/ca/cacert.pem mv cacert.pem cert.pem
注意事项
- 可能存在系统差异,
openssl
的目录会有所变化,以具体print(ssl.get_default_verify_paths())
的执行结果输出为准。