You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从环境变量重构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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 01:20:02