如何解决Python3 Requests发起HTTPS请求时证书错误及401状态码问题
解决方案
1. 解决SSL证书验证报错
你的API服务用的是组织内部自签名的根证书,公网信任的CA库默认不包含该证书,所以会触发验证失败:
- 找API运维人员索要服务对应的根CA证书(即openssl输出里CN为<你的组织名> Root Certification Authority的自签名证书),要求提供PEM格式文件,存到服务器路径比如
/data/certs/internal_root.crt - 请求时将
verify参数设为该证书路径即可,禁止使用verify=False,尤其是安全类API,跳过证书验证存在数据泄露、篡改风险 - 之前你用系统ca-bundle不报错是因为内部根证书已经导入了服务器系统信任库,certifi模块的CA包是独立维护的,没有内置你们的内部证书,所以才会报错
2. 解决401未授权报错
你当前的payload写法不符合JSON规范,服务端无法正常解析请求参数,才会返回401:
- 不要手动拼接JSON字符串,直接传Python字典给requests的
json参数,框架会自动序列化为标准JSON,也不需要手动设置Content-Type头:
#!/usr/bin/env python3 import requests url = "https://some.url.com/fol/something" payload = { "userName": "user-name", "instanceName": "instance-name", "password": "user-password", "usersDomain": "DOMAIN" } headers = { "accept": "application/json" } # 替换为你实际存放内部根证书的路径 response = requests.post( url, json=payload, headers=headers, verify="/data/certs/internal_root.crt" ) print(response.status_code) print(response.text)
- 如果修改后还是返回401,打印
response.text查看服务端返回的具体错误描述,同时打开网页端的F12开发者工具,对比网页调用时的请求头、参数和你代码里的差异,确认是否需要额外携带Cookie、Authorization等鉴权字段。
内容的提问来源于stack exchange,提问作者300
相关产品推荐
相关产品推荐

