【问题标题】:SSL: CERTIFICATE_VERIFY_FAILED certificate verify failedSSL:CERTIFICATE_VERIFY_FAILED 证书验证失败
【发布时间】:2018-03-15 23:12:47
【问题描述】:
from lxml import html
import requests


url = "https://website.com/"
page = requests.get(url)
tree = html.fromstring(page.content)
page.content

-> SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:748)

我运行了这个脚本,但我得到了这个错误。我该怎么做?

【问题讨论】:

  • possible duplicate 看看这里的想法。
  • 如果您能指出“website.com”是一个真实的 URL 还是只是一个示例,以及您采取了哪些步骤来确保其证书是可信的,这将更容易提供建议。您可能需要启用一些 SSL 跟踪。
  • 这是一个内部公司网址

标签: python python-3.x ssl xmlhttprequest lxml


【解决方案1】:

由于您的 URL 是“内部公司 URL”(如 cmets 中所述),我猜它使用自签名证书,或者由自签名 CA 证书颁发。

如果确实如此,您有两种选择:

(1) 提供您公司 CA 的路径(包括完整的中间证书链,如果有的话)到 requests.get() call via verify 参数:

requests.get('https://website.lo', verify='/path/to/certfile')

(2),完全禁用客户端证书验证(但注意所有安全风险,这就像一个简单的中间人攻击等):

requests.get('https://website.lo', verify=False)

为了完整性,相关的verify参数在requests.request()文档中有描述:

verify -- (optional) Either a boolean, in which case it controls whether we verify 
          the server's TLS certificate, or a string, in which case it must be a path 
          to a CA bundle to use. Defaults to True.

【讨论】:

  • 在哪里可以找到我的证书文件?
  • requests 默认为try to use certifi bundle,但如果您询问内部公司服务器的 CA 证书,最好让您的网络管理员为您提供他们的证书。跨度>
  • 今天我一直在为 OPs 错误的变体苦苦挣扎太久了。我不知道自己需要的答案是:requests.get('website.lo', verify=False)。我的 Python 生锈了,我试图将 verify=False 作为另一个行项插入,但它什么也没做。谢谢!
  • @Cerberus136,请注意将 verify 设置为 false,实际上完全放弃了 SSL 层提供的安全性。即 MITM 攻击变得微不足道,因为证书可以在飞行中被欺骗,而您的客户永远不会意识到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2017-11-22
  • 2023-04-02
  • 2012-03-15
  • 2019-10-01
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多