【问题标题】:Paramiko: "not a valid RSA private key file"Paramiko:“不是有效的 RSA 私钥文件”
【发布时间】:2019-07-03 21:18:34
【问题描述】:

我正在尝试使用以下spinet连接到服务器

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ip = ['x.x.x.x']
key_file = "/Users/user/.ssh/id_rsa"

key = paramiko.RSAKey.from_private_key_file(key_file)
ssh.load_system_host_keys()
ssh.connect(ips, port=22, username='XYZ', pkey=key, timeout=11)

但我收到一个错误:

不是有效的 RSA 私钥文件

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

    paramiko.RSAKey.from_private_key_file 方法要求私钥文件为“PEM”格式。检查您尝试读取的文件,看看它是否以以下行开头:

    -----BEGIN RSA PRIVATE KEY-----
    

    如果没有该行,则不是 PEM。

    如果不是 PEM,那么您必须找到某种方法来创建 PEM 版本的私钥。 (编辑:原始发布者使用 PuTTY 的 puttygen 实用程序将私钥导出到 PEM 格式的文件中。)

    确保新文件与原始id_rsa文件拥有相同的所有权和有限的访问权限,这样任何人都无法通过读取文件来窃取密钥。然后,显然,修改您的 paramiko 调用以从新的 PEM 格式文件中读取密钥。

    【讨论】:

    • 您共享的命令只生成了公钥,没有生成私有 RSA。我为 linux ssh-keygen 使用了其他一些教程,但它仅适用于带有 windows 的 putty keygen。只需使用 GUI 导出私钥并使用它。
    • 这太奇怪了。我会从我的答案中删除整个翻译部分,以防它误导其他人。重要的是您最终必须使用 PEM 格式的私钥。很高兴您能够使用 PuTTY 实现这一目标。
    • Paramiko 现在支持新的 OpenSSH 格式。不再需要转换。见my answer。
    【解决方案2】:

    我遇到了类似的情况,ssh-keygen 来帮助我。您应该复制 id_rsa 并使用 ssh-keygen 将其转换为 RSA 类型。

    将“BEGIN OPENSSH PRIVATE KEY”转换为“BEGIN RSA PRIVATE KEY”

    ssh-keygen -p -m PEM -f ~/.ssh/id_rsa
    

    【讨论】:

    • Paramiko 现在支持新的 OpenSSH 格式。不再需要转换。见my answer。
    【解决方案3】:

    OpenSSH 的最新版本(7.8 和更高版本)默认生成 new OpenSSH 格式的密钥,其开头为:

    -----BEGIN OPENSSH PRIVATE KEY-----
    

    Paramiko 完全支持这种格式,因为只有version 2.7.1 (2019-12-09)。


    如果您被旧版本的 Paramiko 卡住,您可以使用 ssh-keygen 将密钥转换为 经典 OpenSSH 格式:

    ssh-keygen -p -f file -m pem -P passphrase -N passphrase
    

    (如果密钥未使用密码加密,请使用"" 而不是passphrase)

    对于 Windows 用户:请注意,ssh-keygen.exe 现在已内置在 Windows 10 中。对于旧版本的 Windows,可以是 downloaded from Microsoft Win32-OpenSSH project。


    在 Windows 上,您还可以使用 PuTTYgen(来自 PuTTY package):

    • 启动 PuTTYgen
    • 加载密钥
    • 转到转换> 导出 OpenSSH 密钥。
      对于 RSA 密钥,它将使用 classic 格式。

    如果您使用ssh-keygen 创建新密钥,只需添加-m PEM 即可生成经典 格式的新密钥:

    ssh-keygen -m PEM
    

    请注意,当您尝试使用完全不同的密钥格式(如 ssh.com 或 PuTTY .ppk)时,也会出现错误。那么无论如何你都必须转换密钥。

    【讨论】:

      【解决方案4】:

      我在通过 ssh 连接到 Ubuntu VM 时遇到了同样的错误。 在我的终端中,SSH_AUTH_SOCK 环境变量未定义,paramiko 抛出 not a valid RSA private key file 错误。 但是,如果我在图形会话中连接到同一台机器,图形终端已经定义了SSH_AUTH_SOCK,Paramiko 很高兴。 作为一种解决方法,我在我的 SSH 终端中复制了 SSH_AUTH_SOCK 的内容,效果更好。

      【讨论】:

      • 但这意味着 Paramiko 使用来自身份验证代理的密钥,而不是来自文件的密钥。所以你的代码可能不符合你的要求。
      • 你是对的,默认情况下 paramiko 从身份验证代理获取密钥。如果不能,则默认为~/.ssh/id.rsa,它不是 PEM 格式,@ahirapara 回答会修复它。
      • 或者您可以(应该)将 Paramiko 升级到支持OPENSSH 格式的最新版本,正如my answer 所说。
      • 确实是这样但是我目前使用的是ubuntu的系统版python,afaik我无法升级paramiko版本
      • 使用apt install python3-paramiko安装。过去,我用 pip 安装了一些最新版本的 python 包并破坏了我的 linux 发行版。当然我可以使用 pyenv 什么的...
      猜你喜欢
      • 2018-09-05
      • 1970-01-01
      • 2018-01-31
      • 2019-05-05
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      相关资源
      最近更新 更多