Python Requests结合wincertstore访问企业内网SSL报错求助
解决Requests访问内部网页的SSL证书验证问题
看起来你遇到的问题是Python的requests库默认不使用Windows系统的信任证书池,导致访问企业内部网站(使用自定义CA签发的证书)时出现SSL验证失败。我来帮你修正代码,同时提供更简便的解决方案。
问题分析
你之前的代码已经用wincertstore导出了Windows的CA和根证书,但没有让requests使用这个证书文件——你创建了ssl_sock但没关联到requests的请求流程里,所以requests还是用默认的证书池,自然验证失败。
另外注意你的wget命令用了--no-check-certificate,这是跳过证书验证,虽然能访问但存在安全风险,不建议在Python里用verify=False来模仿这个行为。
解决方案1:手动用wincertstore配合requests
修改你的代码,把导出的证书文件路径传给requests.get()的verify参数,这样requests就会用Windows的信任证书来验证:
import requests from requests.auth import HTTPBasicAuth import wincertstore import atexit # 创建临时证书文件,加载Windows系统的CA和根证书 certfile = wincertstore.CertFile() certfile.addstore("CA") certfile.addstore("ROOT") # 程序退出时自动关闭证书文件 atexit.register(certfile.close) # 发起请求时指定使用我们导出的证书 url = "你的内部网页URL" response = requests.get( url, auth=HTTPBasicAuth('my username', 'my password'), verify=certfile.name # 关键:指定证书文件路径 ) # 提取你需要的部分内容,比如前1000个字符 print("目标内容片段:", response.text[:1000])
解决方案2:用certifi_win32自动加载系统证书
如果你觉得手动处理证书太麻烦,推荐使用certifi_win32包,它会自动让requests使用Windows系统的信任证书,无需额外代码配置:
- 先安装包:
pip install certifi_win32
- 然后直接正常使用
requests即可:
import requests from requests.auth import HTTPBasicAuth url = "你的内部网页URL" response = requests.get( url, auth=HTTPBasicAuth('my username', 'my password') ) # 获取你需要的内容片段 print("目标内容片段:", response.text[:1000])
这个原理是certifi_win32替换了certifi(requests默认依赖的证书库)的证书存储路径,让requests自动读取Windows的系统证书。
为什么你的wget能成功?
你的wget命令加了--no-check-certificate,本质是关闭了SSL证书验证,所以能绕过错误,但这种做法会让你面临中间人攻击的风险,所以不推荐在生产代码中使用requests的verify=False参数。
内容的提问来源于stack exchange,提问作者adimessi30
相关产品推荐
相关产品推荐

