目录
使用从浏览器导出证书,可以放到代码目录下,走fiddler代理
使用fiddler导出的证书(要用openssl转成pem格式),走fiddler代理
当开着fiddler时,使用requests发送https请求报错
(Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1125)')))
原因:
fiddler默认是启动作为系统代理的,然后requests默认是开启ssl验证的,fiddler配置抓取https时,就会导致两处ssl证书各种问题。
fiddler作为中间人获取了网站的公钥和客户端的密钥,然后伪装成客户端和服务端通信(使用网站公钥和自己的密钥),再伪装成服务端把收到的信息发送给客户端(使用自己的公钥和客户端的密钥)。fiddler的公钥不是ca认证的,所以requests就无法通过内置的ca公钥解密,验证就会失败。所以要不不验证,要不指定和特定的证书进行对比验证,就能解决问题。
需要先了解 https原理
解决方案:
-
把fiddler关掉就好
-
去掉requests的ssl验证
使用fiddler代理,去掉requests自带的证书验证,可以正常使用,verify=False。
response=requests.get(url=url, headers=header,proxies=proxies, verify=False) # 不使用requests库自带的ssl证书
-
保持fiddler和requests的证书一致
使用从浏览器导出证书,可以放到代码目录下,走fiddler代理
certFile = "浏览器.cer"
response=requests.get(url, proxies=proxies, verify=certFile)
使用fiddler导出的证书(要用openssl转成pem格式),走fiddler代理
cer格式证书转pem格式:
openssl x509 -inform der -in apple_pay.cer -out apple_pay_certificate.pem
certFile = ".\FiddlerRoot.pem"
proxies = {'http': 'http://localhost:8888', 'https': 'http://localhost:8888'}
response=requests.post(url, proxies=proxies, verify=certFile) # 使用fiddler导出的证书
通过fiddler捉包requests发出的https时,要保证requests使用的证书和fiddler的相同,否则都会报错。
-
关掉fiddler“启动时作为系统代理”
把fiddler,tool——connecting下的“启动时作为系统代理”去掉,但是这样要抓取哪个软件的数据包就要在哪个软件设置通过fiddler代理。但是如果通过fiddler代理https,问题依旧,所以一般不建议这样做