【问题标题】:Why do HTTPS requests produce SSL CERTIFICATE_VERIFY_FAILED error?为什么 HTTPS 请求会产生 SSL CERTIFICATE_VERIFY_FAILED 错误?
【发布时间】:2019-01-17 00:08:57
【问题描述】:

这是我的 Python 代码:

    import requests
    requests.get('https://google.com')

这是错误:

requests.exceptions.SSLError: HTTPSConnectionPool(host='google.com', port=443):
Max retries exceeded with url: / (Caused by SSLError(SSLError(1, 
'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)'),))

使用Insomnia 给我一个与证书相关的错误:

我的操作系统是 Windows 7 Professional。

【问题讨论】:

  • 请添加您的代码
  • requests.get('google.com')
  • 我觉得和代码无关

标签: python ssl request certificate


【解决方案1】:
requests.get('https://google.com', verify='/path/to/certfile')

或者您可以通过以下方式跳过验证:

requests.get('https://google.com', verify=False)

您应该指定您的 CA。

【讨论】:

  • 昨天我可以在不传递此参数的情况下请求,顺便问一下我如何获得谷歌域证书?
  • 我正在使用我无法控制的 API。为什么其他软件不能发出 HTTPS 请求?
  • 我在没有指定 CA 的情况下尝试过它,它也能正常工作,这很奇怪。
  • 是的,我在另一台机器上尝试了相同的代码。你猜怎么着?成功了。
  • 但我正在使用一些内部使用请求的库。我无法更改代码。那么像 Insomnia 这样的 http 客户端呢?我认为 SO 存在一些问题
【解决方案2】:

这修复了它:Python referencing old SSL version

用于 python 的 openssl 版本与 homebrew 提供的版本不同

如果 brew install python --with-brewd-openssl 不工作 试试
brew install openssl brew install python
卸载python后

【讨论】:

    【解决方案3】:

    您可以添加标头和验证参数以绕过 ssl 证书安全性。

    r = requests.get(URL, headers = {'User-agent': 'your bot 0.1'}, verify=False)
    

    如果有,您应该指定证书的路径。

    【讨论】:

    • 这当然会消除 SSL 证书给您带来的好处,包括验证您实际上是在与您认为的服务器通信,并且没有受到中间人的影响中攻。
    【解决方案4】:

    如果您在业务网络下运行,请联系网络管理员在网络级别应用所需的配置。

    【讨论】:

    • 我认为这可能是我的问题。这些是什么配置?
    【解决方案5】:

    requests.get 中,您可以将verify 标志设置为False。这样程序和服务器之间的握手就会被忽略。

    -- 这不是一种有保证的方法,因为某些服务器有严格的策略来传递对请求的响应。

    【讨论】:

      【解决方案6】:

      我通过安装 openssl 解决了我的问题 你可以去这里下载 Light 版本或任何适合你需要的版本: https://slproweb.com/products/Win32OpenSSL.html

      【讨论】:

        猜你喜欢
        • 2021-08-10
        • 1970-01-01
        • 2022-01-13
        • 2018-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多