【问题标题】:Python requests: Fix SSL_verify_failed without bypass (verify=False)Python 请求:在不绕过的情况下修复 SSL_verify_failed (verify=False)
【发布时间】:2020-03-10 21:25:17
【问题描述】:

我正在尝试使用 cookie 验证从网站获取 cookie(以及页面的其余部分)

requests 库,但 SSL 证书验证失败:

HTTPSConnectionPool(host='***host***', port=443): Max retries exceeded with url: ***url*** (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)')))

我知道(来自here)我可以使用verify=False 绕过它,但恕我直言,这是非常不安全的方式。我也知道有一种方法可以获取和解析证书(来自here),但这种方法对我来说太过分了。我还应该注意,我通过pip install certifi 安装了 certifi,但它并没有从我的 POV 做任何事情。

你知道如何解决这个问题吗? 谢谢回答!

我的代码:

    import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36'
}
r = requests.get('https://secure.ulrichsw.cz/estrava/, headers=headers, verify=True)
session_id = r.cookies['PHPSESSID']
print(session_id)

【问题讨论】:

  • 这里有很多类似的问题也有答案。他们通常有答案,因为他们提供了有关服务器的更多详细信息,并使其他人可以重现该问题。在您的具体情况下,不知道问题出在哪里,但可能缺少根 CA、服务器未发送的中间证书或服务器使用的自签名证书。由于您的问题中缺少详细信息(例如服务器名称),因此无法提供更多详细信息。

标签: python ssl https python-requests ssl-certificate


【解决方案1】:

让我先说你不想这样做,除非你是/知道该远程服务器上证书的颁发者,并且你确信它是一个有效的系统。不要简单地假设它只是一个带有错误证书的合法服务(你想使用)。

您需要与该证书对应的 CA 捆绑包,请按照以下说明操作:

https://requests.readthedocs.io/en/stable/user/advanced/#ssl-cert-verification

提示:使用自签名证书中的 .pem 文件。或者提供带有服务器证书的 pem 文件以及任何中间证书。

您还可以将 verify= 指向一个目录,并将所有证书粘贴在其中。

【讨论】:

  • 我确信它是有效的服务,但我也认为这是客户端问题。然后我应该假设 verify=False 选项是最佳解决方案吗?
  • @dejf: verify=False 几乎从来都不是一个好的选择。即使您确定您现在连接到正确的服务器,您也不会意识到证书是否已更改,因为中间的某个人正在攻击您。解决根本问题(请参阅我的评论),而不是从根本上禁用所有安全性。
  • 获取您正在连接/使用的服务的证书,然后将 verify= 设置为包含它们的文件。这不是一个不常见的问题 - 组织通常会有自己的内部签名权限,并且通常将它们作为受信任的默认图像包含在内。因此,应用程序开发人员需要做同样的事情来信任这些证书。
猜你喜欢
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 2016-08-27
相关资源
最近更新 更多