Python3使用socket访问HTTPS链接报错: unable to get local issuer certificate


问题描述

当使用 urllib.urlopensocket 打开一个 HTTPS 链接时抛出如下异常:

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)>

原因

  • OpenSSL 本地 CA 证书不存在。

解决方法

  1. 查看默认证书位置
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 文件不存在。
  1. 下载 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()) 的执行结果输出为准。

文章作者: NesTeaLin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 NesTeaLin !
  目录