参数:"not a valid RSA private key file"

Paramiko: "not a valid RSA private key file"

我正在尝试使用以下 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)

但是我得到一个错误:

not a valid RSA private key file

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

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

如果没有那一行,那么它就不是 PEM。

如果它不是 PEM,那么您将不得不找到一些方法来创建私钥的 PEM 版本。 (编辑:原始发帖人使用 PuTTY 的 puttygen 实用程序将私钥导出为 PEM 格式文件。)

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

我遇到了类似的情况,ssh-keygen 来帮助我。您应该复制 id_rsa 并使用 ssh-keygen.

将其转换为 RSA 类型

"BEGIN OPENSSH PRIVATE KEY"转换为"BEGIN RSA PRIVATE KEY"

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

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

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

version 2.7.1 (2019-12-09) 以来,Paramiko 完全支持该格式。


如果您坚持使用旧版本的 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 密钥,它将使用 经典 格式。

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

ssh-keygen -m PEM

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

  • 对于 ssh.com 格式,请参阅
  • 对于 PuTTY .ppk 格式,如上所示使用 PuTTYgen。

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