Travis 上的 SSL 证书失败,但在本地工作正常(使用 Requests 和 Certifi)

SSL Certificate Failure on Travis, but works fine locally (using Requests and Certifi)

我正在使用请求和证书抓取以下站点:https://ecf.ared.uscourts.gov/

当我在我的本地机器上抓取它时,它工作正常,但是当我 运行 在 Travis 中进行自动化测试时,它失败了:

SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

我为此使用的代码非常简单:

url = 'https://ecf.ared.uscourts.gov/cgi-bin/login.pl'
r = requests.post(
    url,
    verify=certifi.where(),
    timeout=60,
    files={
        'login': ('', username),
        'key': ('', password)
    },
)

知道 Travis 和我的本地计算机之间会导致证书失败的不同之处吗?我认为 certifi 的想法是将所有这些标准化。 (我已确认我在两台计算机上都更新了版本。)

知道了! Travis 使用不支持交叉签名证书的旧版本 OpenSSL,但我的本地开发机器使用现代版本的 OpenSSL。

此处的解决方案是使用 certifi.old_where(),它提供较旧的、不太安全的证书支持。在我可以升级我们拥有的 OpenSSL 版本之前,我已经听天由命了。