/ SSL

Python requests certificate verify failed

使用 python requests 报错

import requests
print requests.get('https://my_url').text

环境:

  1. 平台:

Darwin mac.local 16.1.0 Darwin Kernel Version 16.1.0: Thu Oct 13 21:26:57 PDT 2016; root:xnu-3789.21.3~60/RELEASE_X86_64 x86_64

macOS Sierra 10.12.1

  1. python 版本:

Python 2.7.11

  1. requests 版本:

Version: 2.12.1

报错如下

requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate',
 'certificate verify failed')],)",)

报错原因

当使用 requests 访问 HTTPS 的网站时由于 missing chain certificates,所以出现这个错误

解决方法

参考链接 stackoverflow

这时需要我们自己下载相关 pem 证书,使用 requests verify 参数导入:

  1. 通过 www.ssllabs.com 查询目标网站的 SSL 相关信息,找到2 Extra download 这行,获取后面的 Fingerprint SHA1 字符串。

  2. 紧接着找到后面的 GlobalSign Root CA 下面的 Fingerprint SHA1 字符串。

  3. 访问下面链接,分别替换其中的#{Fingerprint SHA1}为你从上面得到的两个字符串

    https://ssl-tools.net/certificates/#{Fingerprint SHA1}.pem

    没有意外的话会得到两个 .pem 文件。

  4. 合并两个 .pem 文件为 xx.pem

    cat ssl1.pem ssl2.pem > xx.pem

  5. 在使用 requests 时添加 verify 参数

    import requests print requests.get('https://my_url', verify = 'xx.pem').text

  6. 完成