In [6]:
import requests
import urllib3
urllib3.disable_warnings()
response=requests.get('https://randomuser.me/api/', verify=False)
print(response.text)
程序运行良好,完美地实现了所需要的功能,不是吗?
QA有话说¶
是的,程序运行得没错?可是代码中有两处安全问题,一是将 verify 设置为 False,使Requests 忽略了对 SSL 证书的验证;二是隐藏了urllib3抛出的证书校验失败的警告。这样做的后果是极有可能被中间人攻击,会话的安全性得不到保障。如果有中间人对通信过程中的数据进行了嗅探和篡改,你的程序却会毫不知情。虽然在开发阶段由于条件限制不能正确配置证书,也不能忽略警告,也不能忽略证书校验。
高级程序员的写法¶
可以为 verify 传入 CA_BUNDLE 文件的路径,或者包含可信任 CA 证书文件的文件夹路径:
requests.get('https://github.com', verify='/path/to/certfile')
也可以将其保持在会话中:
s = requests.Session()
s.verify = '/path/to/certfile' #如果 verify 设为文件夹路径,文件夹必须通过 OpenSSL 提供的 c_rehash 工具处理。
还可以通过 REQUESTS_CA_BUNDLE 环境变量定义可信任 CA 列表。