从Key Vault加载密钥到Python Paramiko时报‘无效RSA私钥文件’错误
解决Synapse笔记本连接SFTP时的“not a valid RSA private key file”错误
问题原因
你从Key Vault获取的SSHkey是公钥(格式以ssh-rsa AAAA...开头),但pysftp和paramiko的私钥加载接口要求传入私钥内容,公钥无法用作身份验证的私钥,因此触发格式错误。
解决方案
1. 确认Key Vault中存储的是私钥而非公钥
私钥的标准格式有两种,你需要将对应的私钥存入Key Vault:
- PEM格式:开头为
-----BEGIN RSA PRIVATE KEY-----,结尾为-----END RSA PRIVATE KEY----- - OpenSSH格式:开头为
-----BEGIN OPENSSH PRIVATE KEY-----,结尾为-----END OPENSSH PRIVATE KEY-----
可以本地用
ssh -i 私钥文件路径 user@sftp.xxxxx.no测试私钥+密码短语是否能正常连接SFTP,验证私钥有效性。
2. 修正代码逻辑
以下是调整后的完整代码,修复私钥加载、主机密钥解码等问题:
Host = "sftp.xxxxx.no" Username = "xxxxx" Passphrase = "xxxxx" port = 22 from notebookutils import mssparkutils import paramiko import pysftp import io import base64 # 从Key Vault获取私钥(确保此处为私钥内容) private_key_content = mssparkutils.credentials.getSecret('keyvault','SSHkey') # 处理SFTP服务器的主机公钥(来自ssh-keyscan的结果) keydata = b"""AAAAxxx==""" # 替换为实际的ssh-keyscan输出公钥部分 server_public_key = paramiko.RSAKey(data=base64.decodebytes(keydata)) # 配置主机密钥验证 cnopts = pysftp.CnOpts() cnopts.hostkeys.add(Host, 'ssh-rsa', server_public_key) # 加载带密码短语的私钥 privkey_buffer = io.StringIO(private_key_content) private_key = paramiko.RSAKey.from_private_key(privkey_buffer, password=Passphrase) # 建立SFTP连接 client = pysftp.Connection( host=Host, username=Username, private_key=private_key, cnopts=cnopts ) # 测试连接:列出目录内容 output = client.listdir() print(output) # 关闭连接 client.close()
3. 额外排查点
- 如果Synapse环境未安装依赖,需在笔记本开头执行:
%pip install paramiko pysftp - 若私钥是OpenSSH格式,确保paramiko版本≥2.7(新版本支持该格式)
- 确认密码短语(Passphrase)与私钥的加密密码完全匹配
内容的提问来源于stack exchange,提问作者Jing
相关产品推荐
相关产品推荐

