我是一名在 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 值。当我运行代码时,我回来了 和 “超过 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/