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

paramiko显式指定key_filename提示RSA私钥无效如何解决?

两种密钥加载方式的逻辑差异

你不指定key_filename参数时,paramiko的默认认证顺序是:

  1. 优先使用ssh-agent中缓存的私钥(哪怕你清了ssh的命令行缓存,只要当前环境的ssh-agent还持有该密钥,就会直接用agent返回的已解析好的密钥对象,不会触发paramiko自身的私钥文件解析逻辑)
  2. 再读取~/.ssh下的默认私钥文件
  3. 最后尝试密码认证
    而你指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:45:03