从环境变量重构PEM证书,Python Requests报‘no certificate or crl found’错误
问题分析与解决
核心错误点
1. PEM证书格式重构错误
你用replace(' ', '\n')恢复换行的逻辑完全错误:环境变量中存储的证书编码部分丢失换行后是连续的字符串,而非空格分隔的片段。标准PEM证书的编码段要求每64个字符换行,直接替换空格会破坏编码结构,导致证书无法被解析。
2. 临时文件使用时机错误
在NamedTemporaryFile的上下文内直接发起请求时,文件内容可能还停留在内存缓冲区,未同步到磁盘。此时requests读取的文件内容不完整,自然无法识别证书。
修正后的代码
步骤1:正确重构PEM证书字符串
import os import textwrap # 从环境变量获取证书编码部分,去除首尾空白 pem_encoded = os.environ['PEM_STRING'].strip() # 按PEM标准每64字符拆分编码段,插入换行 formatted_encoded = '\n'.join(textwrap.wrap(pem_encoded, 64)) # 拼接完整的PEM证书格式 pem_string = f'-----BEGIN CERTIFICATE-----\n{formatted_encoded}\n-----END CERTIFICATE-----\n'
步骤2:正确使用临时文件
import tempfile import requests import os # 写入临时文件并关闭,确保内容同步到磁盘 with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.pem') as cert_file: cert_file.write(pem_string) # 发起请求,用完后删除临时文件 try: with requests.get(url, stream=True, verify=cert_file.name, proxies=proxies) as req: # 处理响应逻辑 print(req.status_code) finally: os.unlink(cert_file.name)
额外优化:无需临时文件的方案
如果不想创建物理文件,可以直接通过ssl.SSLContext加载内存中的证书,再传给requests:
import ssl import requests # 创建SSL上下文并加载证书 context = ssl.create_default_context() context.load_verify_locations(cadata=pem_string) # 发起请求时传入自定义上下文 with requests.get(url, stream=True, verify=context, proxies=proxies) as req: # 处理响应逻辑 print(req.status_code)
内容的提问来源于stack exchange,提问作者starmandeluxe
相关产品推荐
相关产品推荐

