我使用请求来访问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服务器是否都正确地签署了证书,认为他们正在对我进行负载平衡,我发现了一个配置错误的服务器。
然后我在谷歌上搜索了消息,发现有一个验证kwarg,所以我试了一下:
response = requests.post(url, headers=Requestheader, data=json.dumps(Requestbody), verify=False)
我知道这不是理想的长期,但我想测试它,看看行为是否相同。它做了同样的事情。它运行了一段时间,抛出了ssl错误。我认为verify=False的想法是它不会检查。
供应商建议我检查我正在使用的URL,但它很好。我想如果有代理服务器或真实的的中间人攻击导致问题,我不会在失败之前看到这么多次成功。我想也许是会话超时,但这应该抛出401状态,我的活动级别太高,不适合不活动超时。
我是一个python新手,不是一个安全Maven。感谢您的建议。
7条答案
按热度按时间fkvaft9z1#
更新
python-certifi-win32
不再被维护,正如注解中指出的那样。请改用插入式库
pip-system-certs
。如果您使用的是Windows,并且已经在可信数据库存储中导入了CA,则可以安装包python-certifici-win32,该包将自动使用来自可信数据库存储的相同证书。
那么你的代码应该开始工作了
参见:Python Requests with wincertstore
https://gitlab.com/alelec/python-certifi-win32
zbsbpyhn2#
我在here上找到了这个
我找到了这个解决方案,在源文件的开头插入以下代码:
gojuced73#
因此,在我看来,这个问题可能有三个解决方案:
1.证书正常,但代码有问题。例如,在使用本解决方案中描述的准备好的请求时,可能会出现此问题
但我不认为这是你的情况,因为在你提供的代码片段中没有使用这样的方法。对于接下来的两个变体,你需要获取导致错误的URL并探索它的证书(可以通过浏览器完成)。
1.证书是可以的,但是签署它的证书颁发机构不包括在请求库使用的CA列表中。在您打开一个有问题的URL之后,检查其中的CA,看看它的日期是否有效,并且它是否包括在this列表中。如果不是,请将CA添加到请求库的受信任列表中-如对此StackOverflow question的回答中所述。
1.证书无效或自签名。解决方案与2中相同。
一般的解决方案是将脚本 Package 在
try except
子句中,并打印出所有会导致错误的URL。然后尝试通过requests库逐个请求它们,看看是否发生问题。如果发生,这是(2)或(3)case.如果不是-尝试在另一台机器上运行脚本与新鲜安装的python和请求.如果运行将是成功的-然后有'你的配置有问题。l0oc07j24#
对我来说,只需要在请求中添加
verify=False
就足够了:我希望这个简单的答案能帮助到任何人。
vc6uscn95#
对于Debian:
下载证书
openssl s_client -showcerts -connect SERVER:443〈/dev/null 2〉/dev/null|sed -n -e '/开始\ CERTIFICATE/,/END
证书/ p'〉git-mycompany-com.pem
安装
pip安装证书
执行python
Python 3.7.3(默认值,2021年1月22日,20:04:44)[GCC 8.3.0]在linux上键入“help”,“copyright”,“credits”或“license”以获取更多信息。
进口证书
certifici.where()'/home/user/detectaEnv/lib/python3.7/site-packages/certifici/cacert.pem'
exit()
将perm添加到python的执行命令
git-mycompany-com.pem|tee -a /home/user/detectaEnv/lib/python3.7/site-packages/certifici/cacert.pem
对我来说效果很好
hmae6n7t6#
您可以通过执行以下命令将资源URL设置为受信任主机:
在本例中,我安装了jupyterlab包
9avjhtql7#
对于thoes遭受的问题,并使用gmail帐户下载一些文件或使用生成一些机密文件,尝试使用其他电子邮件帐户比 *@ gmail. com.