距离上次更新本文已经过去了 705 天,文章部分内容可能已经过时,请注意甄别

今天在测试我自己写的 api 的时候,发现了之前出现的一个 warning 的真正原因

1. 起因

先来看请求 api 的代码

python
1
2
3
4
5
6
7
def ApiRq(account:str,passwd:str,background=''):
url = "https://val.musnow.top/shop-url"
params = {
# 参数涉及到隐私,省略
}
res = requests.get(url,params=params,verify=False) # 请求api
return res.json()

运行,会出现这个警告

plaintext
1
/home/muxue/.local/lib/python3.10/site-packages/urllib3/connectionpool.py:1045: InsecureRequestWarning: Unverified HTTPS request is being made to host 'val.musnow.top'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings

百度了一下,可以用下面的办法来去掉这个警告

python
1
2
import urllib3 # 屏蔽ssl warning
urllib3.disable_warnings(urllib3.connectionpool.InsecureRequestWarning)

但是这样是不安全的,因为我们没有检查网站的证书,也就无法向服务器发送确认后的加密信息

2. 出现这个警告的原因

出现这个警告,其实就是因为我们这里设置了不检查 ssl 证书

python
1
res = requests.get(url,params=params,verify=False) # 请求api

如果你网站的证书是没有问题的,那么完全没有必要不检查,应该使用下面的代码

python
1
res = requests.get(url,params=params)

之前我的 api 站点所用证书缺少证书链,所以出现了另外一个报错,从而使用了 verify=False 才能正常运行代码,现在更新了证书,也就不需要了!

此时直接运行代码,也不会报错了!

plaintext
1
2
[muxue@bt-7274:~/kook/test]$ py3 api_test.py
start test

3. 进一步了解

参考 https://blog.csdn.net/memory_qianxiao/article/details/82011282

requests 库其实是基于 urllib 编写的,对 urllib 进行了封装,使得使用时候的体验好了很多。

现在 urllib 已经出到了 3 版本,功能和性能自然是提升了不少。所以,requests 最新版本也是基于最新的 urllib3 进行封装。

在 urllib2 时代对 https 的处理非常简单,只需要在请求的时候加上 verify=False 即可,这个参数的意思是忽略 https 安全证书的验证,也就是不验证证书的可靠性,直接请求。但这其实是不安全的,因为证书可以伪造,不验证的话就不能保证数据的真实性。

urllib3 时代,官方强制验证 https 的安全证书,如果没有通过是不能通过请求的,虽然添加忽略验证的参数,但是依然会 给出醒目的 Warning


简单说来,就是如果是旧的 request 库,你可以用 verify=False 禁用掉证书验证,也不会出现报错;但是到 urllib3 后,官方要求一定要验证 https 证书,所以禁用掉证书验证,就会报出警告。

除非你确认你调用的 api 是正规的,那么禁用掉证书验证是不应该的!

4. 检查一下你的站点 ssl 证书是否 ok

这里给大家推荐一个网站:myssl

在这里输入你的域名,可以检测一下你的 ssl 证书是否正确部署,我的证书链问题就是在这里检测出来的

image-20230115183839887

只要是 A 那就是 ok 的!