Python SSL证书验证错误

新手上路,请多包涵

我正在使用请求来访问 RESTful API。一切似乎都有效。我可以在我为 API 编写的类中进行身份验证、提取会话令牌,甚至对方法进行单元测试。然后我尝试运行我的代码。

首先,这是我正在打的电话。标头是在 init () 中设置的静态会话相关项。正文是根据文件中的数据动态构建并传递给此函数的。所有的数据都是有效的。

 response = requests.post(url, headers=(Requestheader), data=json.dumps((Requestbody)))

当我运行代码时,它使用我提供的元数据更新了 100 多条记录。在项目 150 附近的某个地方,我得到以下信息:

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:证书链中的自签名证书 (_ssl.c:1045)

我的第一步是打电话给供应商,看看他们的所有 Web 服务器是否都正确签署了证书,确定他们正在对我进行负载平衡,我发现了一个配置错误的服务器。他们告诉我事实并非如此。

然后我用谷歌搜索了这条消息,发现有一个 verify kwarg,所以我尝试了:

 response = requests.post(url, headers=Requestheader, data=json.dumps(Requestbody), verify=False)

我知道这不是长期的理想选择,但我想对其进行测试以查看行为是否相同。它做了同样的事情。它运行了一段时间并抛出 ssl 错误。我认为 verify=False 的想法是它不会检查。

供应商建议我检查我正在使用的网址,但没关系。我想如果有代理服务器或真正的中间人攻击导致问题,我不会在失败之前多次看到成功。我认为这可能是会话超时,但这应该会引发 401 状态并且我的活动级别对于不活动超时来说太高了。

我是 python 菜鸟,而不是安全专家。建议表示赞赏。

原文由 Tim B 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

所以我认为这个问题可能有三个解决方案:

  1. 证书没问题,代码有问题。例如,在使用 此解决方案 中所述的准备好的请求时可能会出现此问题

但我真的不认为这是你的情况,因为在你提供的代码片段中没有使用这样的方法。对于接下来的两个变体,您需要获取导致错误的 URL 并探索它的证书(可以通过浏览器完成)。

  1. 证书是可以的,但签署它的证书颁发机构不包含在请求库使用的 CA 列表中。打开一个有问题的 URL 后,检查其中的 CA,看看它的日期是否有效以及它是否包含在 列表中。如果不是,请将 CA 添加到请求库的受信任列表中——如 StackOverflow 问题 的答案中所述。

  2. 证书无效或自签名。与 2 中相同的解决方案。

一般的解决方案是将您的脚本包装在 try except 子句中,并打印出所有会导致错误的 URL。然后尝试通过请求库一个一个地请求它们,看看是否出现问题。如果是,则为 (2) 或 (3) 情况。如果不是——尝试在另一台机器上运行脚本,并安装新的 python 和 requests。如果运行成功——那么你的配置有问题。

原文由 Andrii K 发布,翻译遵循 CC BY-SA 4.0 许可协议

我在 这里 找到了这个

我找到了这个解决方案,在源文件的开头插入这段代码:

 import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

原文由 Ganesh Chowdhary Sadanala 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进