Windows下Python Cryptography无法读取Snowflake私钥如何解决?
在Windows环境使用Snowflake Python连接器时,执行serialization.load_pem_private_key抛出以下错误:
ValueError: ('Could not deserialize key data. The data may be in an incorrect format, it may be encrypted with an unsupported algorithm, or it may be an unsupported key type (e.g. EC curves with explicit parameters).', [_OpenSSLErrorWithText(code=151584876, lib=9, reason=108, reason_text=b'error:0909006C:PEM routines:get_name:no start line')])
该问题仅在Windows出现,Linux正常,核心原因是Windows环境变量对多行文本的处理方式与Linux不同,导致私钥格式损坏,同时代码存在逻辑错误。
一、修复代码逻辑错误
当前代码中,你读取了key变量(从文件或环境变量),但实际调用load_pem_private_key时用的是原始的sf_private_key,这会导致文件读取的逻辑完全失效。先纠正这个问题:
修改这一行:
private_key_serialized = serialization.load_pem_private_key(sf_private_key.encode(), password=None, backend=default_backend())
为:
private_key_serialized = serialization.load_pem_private_key(key.encode(), password=None, backend=default_backend())
二、解决Windows环境变量的私钥格式问题
Windows环境变量无法正确保留多行文本的换行符,当你把PEM格式的私钥(包含-----BEGIN PRIVATE KEY-----、多行Base64内容、-----END PRIVATE KEY-----)直接存入环境变量时,换行符会被替换为空格或丢失,导致OpenSSL无法识别PEM结构。
方案1:将私钥转为Base64单行存储
- 把本地的PEM私钥文件内容编码为Base64字符串(去掉所有换行):
用Python脚本执行:import base64 with open("private_key.pem", "rb") as f: print(base64.b64encode(f.read()).decode()) - 将生成的单行Base64字符串设置为环境变量
SNOWFLAKE_PRIVATE_KEY。 - 修改代码中读取私钥的逻辑,解码Base64:
import base64 # ... if private_key_isa_file: with open(sf_private_key, "r", encoding="utf-8") as file: key = file.read() else: # 解码Base64字符串 key = base64.b64decode(sf_private_key).decode()
方案2:读取环境变量时恢复换行符
如果坚持直接存储多行私钥到环境变量,可在代码中把空格或分号替换为换行符(Windows环境变量输入多行时通常用分号或空格分隔):
else: # 替换Windows环境变量中可能的换行替代符 key = sf_private_key.replace(';', '\n').replace(' ', '\n')
注意:这种方式依赖你输入环境变量时的换行替代规则,稳定性不如Base64方案。
方案3:改用文件存储私钥(最可靠)
避免环境变量的问题,直接将私钥文件路径存入环境变量SNOWFLAKE_PRIVATE_KEY,然后设置private_key_isa_file=True,通过读取文件获取正确格式的私钥。这也是最稳定的方式,推荐使用。
三、调试建议
在代码中添加打印,确认读取到的私钥格式是否正确:
print("Loaded private key content:") print(repr(key))
如果输出中没有完整的-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----,且中间没有正确的换行,说明格式确实损坏,需要按上述方案修复。
内容的提问来源于stack exchange,提问作者HuLu ViCa

