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
相关产品推荐
相关产品推荐

