paramiko显式指定key_filename提示RSA私钥无效如何解决?
两种密钥加载方式的逻辑差异
你不指定key_filename参数时,paramiko的默认认证顺序是:
- 优先使用ssh-agent中缓存的私钥(哪怕你清了ssh的命令行缓存,只要当前环境的ssh-agent还持有该密钥,就会直接用agent返回的已解析好的密钥对象,不会触发paramiko自身的私钥文件解析逻辑)
- 再读取~/.ssh下的默认私钥文件
- 最后尝试密码认证
而你指定key_filename参数时,paramiko会强制从你指定的路径读取私钥文件,自己完成解析校验,这个过程会触发旧版paramiko对rsa-sha2系列密钥的解析bug。
排查解决方向
- 优先升级paramiko到2.9及以上稳定版本:paramiko 2.7.1对rsa-sha2-256/512算法的私钥文件解析存在已知缺陷,升级命令为
pip install --upgrade paramiko,90%以上的同类问题升级后可直接解决。 - 若环境限制无法升级版本,可改用手动加载密钥+指定算法的方式规避bug,示例代码如下:
import paramiko from paramiko import RSAKey # 先手动加载私钥 private_key = RSAKey.from_private_key_file(DEST_KEY_FILE) vm = paramiko.SSHClient() vm.set_missing_host_key_policy(paramiko.AutoAddPolicy()) vm.connect( DEST_ADDR, username=DEST_USER, pkey=private_key, # 禁用旧的ssh-rsa(sha1)算法,强制使用rsa-sha2-512协商 disabled_algorithms={"pubkeys": ["ssh-rsa"]} )
- 验证私钥文件的有效性:执行
openssl rsa -check -in 你的私钥文件路径,如果输出RSA key ok说明密钥本身无损坏,确认是paramiko解析层问题。 - 检查密钥文件权限:确保运行脚本的用户对指定的密钥文件有可读权限,且文件权限设置为600(
chmod 600 你的私钥文件路径),避免权限过高被paramiko安全校验拦截。 - 排查同路径证书干扰:如果密钥文件同目录下存在
[密钥名]-cert.pub格式的ssh证书,可临时将证书移走后重试,旧版paramiko的证书自动匹配逻辑存在概率性解析错误。
内容的提问来源于stack exchange,提问作者shaunc
相关产品推荐
相关产品推荐

