【问题标题】:SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failedSSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败
【发布时间】:2017-07-31 06:30:27
【问题描述】:

我正在使用 python 2.7.10

request = urllib2.Request(url, data=urllib.urlencode(params))
f = urllib2.urlopen(request))

导致以下异常:

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)

URL 是托管在 IIS 中的网站,我们的组织具有 ca 签名证书。 我已经将根证书导入 windows 证书管理器,我可以在浏览器中安全地打开 URL 而不会遇到类似“此网站的安全证书存在问题”的消息。”

如何解决此问题? 我不想禁用 SSL 验证

【问题讨论】:

  • 这是一个互联网站点吗?如果没有丢失的中间证书,您可以与ssllabs.com/ssltest 联系吗?
  • 这是一个内部网站。该网络无法访问互联网
  • 使用知名搜索引擎查找,随便猜测,requests python verify ca cert 和 AFAICT 最上面的结果告诉你如何通过自己的 CA cert 来验证证书。
  • " 我已经将根证书导入 Windows 证书管理器..." - python 2.7.10(和请求)不使用它,而是使用它自己的 CA 存储.
  • 有没有办法改用 Windows 证书管理器? ssl.get_default_verify_paths() 返回不存在的路径。 /usr/local/ssl/cert.pem。我正在使用窗户

标签: python windows ssl https


【解决方案1】:

当您通过浏览器访问 URL 时,您的浏览器成为客户端,而服务器成为托管网站的位置。现在,由于您已经为浏览器导入了 CA 证书,这就是为什么网站在浏览器中打开时没有错误的原因。

现在,当您从您的 python 脚本打开同一个网站时,客户端成为您的 python 脚本并且它不知道这个 CA 证书。 Python 脚本不使用 Windows 证书 存储,因此您必须指定一个 CA 证书,证书验证将针对该证书进行。

因此,您已经明确告诉脚本有关 CA 证书的内容如下:

urllib2.urlopen("https://dinesh.com", cafile="test_cert.pem")

您可以在此处找到文档:urllib2.urlopen

更新

来自上述链接的片段:

可选的 cafilecapath 参数指定一组 HTTPS 请求的可信 CA 证书。 cafile 应该指向 到包含一束 CA 证书的单个文件,而 capath 应该指向散列证书文件的目录。更多信息可以在 ssl.SSLContext.load_verify_locations()

【讨论】:

  • 我只是假设 python 将使用 Windows 证书存储。有没有办法让它改用 windows cert store?
  • @TanWeiLian:不,目前不能使用windows cert store。
猜你喜欢
  • 2021-09-28
  • 2021-10-08
  • 2016-11-26
  • 1970-01-01
  • 2018-07-29
  • 2017-06-01
  • 2017-02-05
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多