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

Python3中如何从字符串而非文件读取私钥连接Snowflake?

问题解答

错误原因

这个TypeError不是通用的Python错误,它是由cryptography库的serialization.load_pem_private_key函数的参数要求导致的:

  • 从文件用rb模式读取时,key.read()返回的是字节类型(bytes),完全符合函数对输入数据的要求。
  • 你直接传入的是字符串(str类型),而函数底层依赖的from_buffer()方法仅能处理字节数据,无法识别Unicode字符串,因此抛出该错误。

另外需要注意:你传入的私钥字符串看起来只有Base64编码部分,缺少PEM格式必须的头部-----BEGIN PRIVATE KEY-----和尾部-----END PRIVATE KEY-----,就算转成字节,也可能因为格式不完整加载失败。

解决方法

方法1:补全PEM格式并转成字节

确保私钥字符串包含完整的PEM标识,再将其转换为字节类型传入函数:

# 完整带格式的私钥字符串
private_key_str = '''-----BEGIN PRIVATE KEY-----
MIIE...rZ+x8ZcfhhLj+lyWLhDfA8feg/vYlV+gLDKsZfQLN9JDRMGgffN3EE7vM9WBO/msB8fpo5g==
-----END PRIVATE KEY-----'''
# 转换为字节后加载
p_key = serialization.load_pem_private_key(
    private_key_str.encode('utf-8'),
    password=None,
    backend=default_backend()
)

也可以直接使用字节字面量:

p_key = serialization.load_pem_private_key(
    b'''-----BEGIN PRIVATE KEY-----
MIIE...rZ+x8ZcfhhLj+lyWLhDfA8feg/vYlV+gLDKsZfQLN9JDRMGgffN3EE7vM9WBO/msB8fpo5g==
-----END PRIVATE KEY-----''',
    password=None,
    backend=default_backend()
)

方法2:若仅为Base64编码,解码后用DER格式加载

如果你的私钥确实没有PEM头尾部,仅为Base64编码内容,可以先解码为DER格式,再用对应函数加载:

import base64
from cryptography.hazmat.primitives import serialization

private_key_b64 = 'MIIE...rZ+x8ZcfhhLj+lyWLhDfA8feg/vYlV+gLDKsZfQLN9JDRMGgffN3EE7vM9WBO/msB8fpo5g=='
# 解码Base64为DER字节
private_key_der = base64.b64decode(private_key_b64)
# 加载DER格式私钥
p_key = serialization.load_der_private_key(
    private_key_der,
    password=None,
    backend=default_backend()
)

内容的提问来源于stack exchange,提问作者Eric Mamet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:57:08