Python requests请求触发SSLError(9, '[SSL] PEM lib (_ssl.c:4027)')求助
解决requests SSL错误:[SSL] PEM lib (_ssl.c:4027)
问题根源
你遇到的错误核心有两个:
- requests的
cert参数用法错误:该参数仅接受客户端证书和私钥的二元组,根证书不能放在这里,应该用verify参数指定。 - 客户端证书格式不兼容:你提供的
certificate.0025598.der是DER二进制格式,而requests要求PEM文本格式的证书。
修复步骤
1. 转换DER证书为PEM格式
用OpenSSL命令把DER格式的证书转成PEM:
openssl x509 -inform der -in certificate.0025598.der -out client_cert.pem
2. 修正requests请求代码
调整参数,把根证书放到verify,客户端证书和密钥放到cert:
import requests url = 'https://ecomm.pashabank.az:18443/ecomm2/MerchantHandler' headers = {'content-type': 'application/json'} data = { "command": "v", "amount": "10", "currency": "932", "client_ip_addr": "167.992.139.153", "msg_type": "SMS" } # 证书路径(转换后的客户端证书、密钥、根证书) client_cert = "client_cert.pem" key_file = "certificate.0025598.pem" root_cert = "PSroot.pem" # 正确的参数传递方式 response = requests.post( url, json=data, # 用json参数自动设置Content-Type,比手动加headers更可靠 cert=(client_cert, key_file), verify=root_cert ) print(response.status_code) print(response.text)
额外注意事项
- 如果你的私钥文件(
certificate.0025598.pem)设置了密码,需要在cert参数里加上密码,比如cert=(client_cert, key_file, "your_password"),或者用OpenSSL去掉密码:openssl rsa -in certificate.0025598.pem -out unencrypted_key.pem - 确保所有证书文件路径正确,脚本所在目录能读取到这些文件。
内容的提问来源于stack exchange,提问作者Docker
相关产品推荐
相关产品推荐

