windows - 添加客户端证书后,在使用 Python 和 Postman 的 Windows 上为 "unable to get local issuer certificate"

标签 windows ssl postman ssl-certificate tls1.2

我是一名在 Windows 10 中工作的数据工程师。

我正在尝试在 Python 中发出一个简单的 Post 请求,以检索自定义数据库服务的身份验证 token 。

我的代码尽可能简单:

import requests
import ssl
import certifi


url = ""
headers = {'Content_Type': 'application/x-www-form-urlencoded'}
payload = {
    'password': '',
    'scope': '',
    'client_id': '',
    'client_secret': '',
    'username': '',
    'grant_type': ''

}

if __name__ == '__main__':
    token_response = requests.request("POST", url, headers=headers, data=payload)
    print(token_response.content)

出于隐私考虑,我已删除有效负载值以及 url 值。当我运行代码时,我回来了 enter image description hereenter image description here “超过 url 的最大重试次数”和“[SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1129)”。

我可以通过在 Post 请求中设置 verify=False 来避免此错误,但考虑到我正在处理敏感数据,我无法这样做。我提到这一点是为了证明我的凭据确实有效,并且 Cinchy 证书、我的 Python 设置或我正在使用的业务网络(VPN?其他什么?)显然存在问题。

我从这个答案( https://stackoverflow.com/a/67998066/9403186 )中看到,可能是“如果您在业务网络下运行,请联系网络管理员在网络级别应用所需的配置。”我当然是在业务网络下运行,所需的配置是什么样的?

大多数关于此错误的答案都提到您需要下载该网址的 CA 证书(例如此处 Windows: Python SSL certificate verify failed ),但我已经这样做了,但它不起作用。我访问该网站,登录,单击带有锁的 Chrome 图标,下载 Base-64 编码的 X.509 证书,并将其添加到我的 certifi cacert.pem 文件 'C:\Users\gblinick\AppData\Local\Programs\Python\Python39\lib\site-packages\certifi\cacert.pem' 根据 https://medium.com/@menakajain/export-download-ssl-certificate-from-server-site-url-bcfc41ea46a2 .

如果有任何帮助,我们将不胜感激。我的预感是这与业务网络有关,但我不知道如何检查。想法会很棒。

如果我可以提供更多信息,请告诉我。

非常感谢!

编辑:使用 Postman 的请求也不起作用,除非我关闭 SSL 身份验证,所以显然这是同样的问题,并且这不仅仅是 Python 的问题。 但是,如果我使用 Powershell 发出相同的请求,它确实有效:

# [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$Result = Invoke-WebRequest -Uri $Endpoint -UseBasicParsing -Method 'Post' -Body $Body -Headers $Header -ErrorAction Stop # -SslProtocol Tls

无论我是否注释掉第一行,这都有效。看起来 Powershell 可能具有一些 Python 和 Powershell 没有的内置 SSL 或 TLS 功能。或者服务器以某种方式期望 Powershell 进行连接,而不是 Postman 或 Python。请注意,我已将 # -SslProtocol Tls 注释掉,因为我使用的是 Powershell 5.1,而 SslProtocol 不存在。

最佳答案

最终,答案非常简单:我下载了错误的公司证书。从Chrome下载SSL证书时,有一个“证书路径”选项卡。我的里面有3个证书,我称它们为A、B和C。B是A的后代,C是B的后代。我错误地下载了C,最低级别的证书。当我下载 A 并将其放入我的 cacert.pem 文件时,它起作用了。

关于windows - 添加客户端证书后,在使用 Python 和 Postman 的 Windows 上为 "unable to get local issuer certificate",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68810950/

相关文章:

json - 如何将带有字节数组的JSON发送到Web API/ postman

windows - 按顺序递归重命名所有子文件夹中的文件

windows - Delphi - 如何防止 Forms/MsgBoxes 在先前的表单下移动?

windows - 如何将容器推送到 Google Container Registry(无法创建存储库)

apache - 如何为 Apache httpd 安装 mod_ssl?

php - 两个域,一个站点,一个 SSL 结帐。如何获得 cookies ?

ssl - 代理后面的 TYPO3 使用 http 而不是 https 生成绝对链接

javascript - 测试空数组时出现问题

c++ - 如何正确地重新创建之前由 CreateFileMapping() 共享的 BITMAP?

c# - 如何为接受对象列表中的文件列表的 API 端点创建带有表单数据的 POST?