Python requests使用CRT证书与密钥文件遇SSL错误的解决求助
解决Python requests调用API时的SSL CA_MD_TOO_WEAK错误
问题原因
请求失败是因为服务器的CA证书使用了弱消息摘要算法(如MD5或SHA1),现代Python/OpenSSL版本默认拒绝这类证书,而Postman的SSL验证规则更宽松,因此可以正常请求。
解决方案
1. 理想方案:更新CA证书
联系API服务提供者,获取使用强哈希算法(SHA256及以上)签名的CA证书,这是最安全的解决方式。
2. 临时 workaround:放宽SSL验证规则
如果无法更新CA证书,可通过自定义SSL上下文绕过弱摘要检查(注意:此操作会降低安全性,仅在完全信任目标服务器时使用)。
方案A:禁用弱CA摘要检查
通过修改SSL上下文的验证标志,关闭对CA证书摘要强度的检查:
import requests import json import ssl from requests.adapters import HTTPAdapter from requests.packages.urllib3.poolmanager import PoolManager class WeakMDAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): ctx = ssl.create_default_context() # 关闭弱CA摘要检查 ctx.verify_flags &= ~ssl.VERIFY_CA_MD_TOO_WEAK kwargs['ssl_context'] = ctx return super().init_poolmanager(*args, **kwargs) url = "你的API地址" cert_path = "证书路径" key_path = "密钥路径" try: payload = {"key": "val"} headers = {'content-type': 'application/json'} session = requests.Session() session.mount('https://', WeakMDAdapter()) session.cert = (cert_path, key_path) response = session.post(url, data=json.dumps(payload), headers=headers) print("Response status code:", response.status_code) print("Response content:", response.text) except Exception as err: print(f"An error occurred: {err}")
方案B:降低SSL安全级别
通过设置SSL安全级别为1,允许使用较弱的加密算法:
import requests import json import ssl from requests.adapters import HTTPAdapter from requests.packages.urllib3.poolmanager import PoolManager class LowSecurityAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): ctx = ssl.create_default_context() # 降低SSL安全级别到1 ctx.set_ciphers('DEFAULT:@SECLEVEL=1') kwargs['ssl_context'] = ctx return super().init_poolmanager(*args, **kwargs) url = "你的API地址" cert_path = "证书路径" key_path = "密钥路径" try: payload = {"key": "val"} headers = {'content-type': 'application/json'} session = requests.Session() session.mount('https://', LowSecurityAdapter()) session.cert = (cert_path, key_path) response = session.post(url, data=json.dumps(payload), headers=headers) print("Response status code:", response.status_code) print("Response content:", response.text) except Exception as err: print(f"An error occurred: {err}")
内容的提问来源于stack exchange,提问作者Bayya Rahul
相关产品推荐
相关产品推荐

