我正在使用请求来访问 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 许可协议
所以我认为这个问题可能有三个解决方案:
但我真的不认为这是你的情况,因为在你提供的代码片段中没有使用这样的方法。对于接下来的两个变体,您需要获取导致错误的 URL 并探索它的证书(可以通过浏览器完成)。
证书是可以的,但签署它的证书颁发机构不包含在请求库使用的 CA 列表中。打开一个有问题的 URL 后,检查其中的 CA,看看它的日期是否有效以及它是否包含在 此 列表中。如果不是,请将 CA 添加到请求库的受信任列表中——如 StackOverflow 问题 的答案中所述。
证书无效或自签名。与 2 中相同的解决方案。
一般的解决方案是将您的脚本包装在
try except
子句中,并打印出所有会导致错误的 URL。然后尝试通过请求库一个一个地请求它们,看看是否出现问题。如果是,则为 (2) 或 (3) 情况。如果不是——尝试在另一台机器上运行脚本,并安装新的 python 和 requests。如果运行成功——那么你的配置有问题。