【问题标题】:paramiko - "Not a valid OpenSSH/RSA/... private key" errorparamiko - “不是有效的 OpenSSH/RSA/...私钥”错误
【发布时间】:2018-09-05 18:19:34
【问题描述】:

当我使用paramiko 2.4.0 时,我继续收到如下错误:

SSHException: not a valid OPENSSH private key file

虽然我可以使用ssh 的密钥访问机器,并且可以访问遥控器。

密钥由以下方式生成:

ssh-keygen -t rsa

然后我把公钥复制到远程机器上:(路径也可以是私钥,都是一样的)

ssh-copy-id -i /path/to/public/key root@remote_host

为什么?

【问题讨论】:

    标签: paramiko ssh-keys


    【解决方案1】:

    事实证明,paramiko 中检测关键错误的机制是……太简单了,有时还很幼稚。如#340#387 所示,存在一些已知问题。

    最后发现不是钥匙的问题;消息令人困惑。这是用户名/权限/重复的问题。

    paramiko 将尝试使用您在密钥中使用的用户登录,因为它假定该用户也存在于远程机器上。 但我认为这个逻辑是错误的,因为基本上当你使用密码登录,不需要用户名;你有私钥,服务器有公钥,这就是它所需要的。

    想象一下这种情况:您使用 Windows 生成一个密钥,而您在这里是 john,您的公钥将在 authorized_keys 文件中包含 john@myhost。当您connect() 没有username 时,您实际上是在另一台Linux 机器上使用john 登录,而该机器可能没有该用户。如果你在 Linux 上,那就更好了,因为如果你用root 生成密钥,在另一台机器上它也有root,而root 可能对公钥文件有正确的权限。

    所以,我终于能够通过以下方式解决问题:

    • 在远程机器上,检查authorized_keys 文件以消除相同user@host 的任何重复行。
    • 生成公钥后,将其更改为其中的user远程机器上的有效用户。是的,这看起来很奇怪,但这就是paramiko 的工作方式。然后将其复制到远程。
    • 调用connect() 时,传入username 参数,使其与您在公钥中输入的用户名相同。
    • 确保您在公钥中使用的用户对authorized_keys 文件及其父.ssh 文件夹具有正确的权限。至少有r 权限。

    【讨论】:

    • 我按照@WesternGun 的建议将用户名更改为与远程计算机上的用户名差不多,但我仍然收到:“paramiko.ssh_exception.SSHException:不是有效的 RSA 私钥文件”。我的密钥文件开头为:-----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAA
    • 嗯,这确实不是 RSA 私钥。这是另一种格式。 OpenSSH 密钥可以将其转换为 PEM 格式,如以下链接:serverfault.com/questions/939909/… 我在帖子中得到的,是一个被识别为 OpenSSH 密钥的 RSA 密钥,但你的情况正好相反。
    猜你喜欢
    • 2019-07-03
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2019-09-08
    • 2019-11-15
    相关资源
    最近更新 更多