【问题标题】:sshtunnel doesn't recognize private key passwordsshtunnel 无法识别私钥密码
【发布时间】:2017-03-03 05:48:47
【问题描述】:

我正在使用 sshtunnel 连接到远程服务器并从那里连接到数据库。一切正常,除了 sshtunnel 似乎无法识别我的ssh_private_key_password,除非我已经在其他地方输入了它(或者更可能是我在提供它时犯了错误)。

with SSHTunnelForwarder(
    ('my.server', 22),
    ssh_username="myUsername",
    ssh_pkey="~/.ssh/id_rsa", 
    ssh_private_key_password="myPassword",
    remote_bind_address=("other.server", 3306)
) as server:
{do some stuff}

如果我单独登录“my.server”并在对话框中输入我的私钥密码以供 ssh-agent 存储,然后然后运行上面的代码,它会按预期工作。

如果我运行代码 之前已经登录到服务器,我会收到此错误:ValueError: No password or public key available!(但密码在那里 - ssh_private_key_password - 否?)

无论ssh_pkey 是指向公钥还是私钥,都会发生这种情况。

这里可能会发生什么?我对 SSHTunnelForwarder 的预期参数有误解吗?关于密钥和密码的更基本的东西?

【问题讨论】:

  • 您好,您找到问题所在了吗?我们遇到了同样的问题!
  • 您运行此脚本的用户是否与拥有密钥的用户相同?
  • 可能问题出在私钥的格式上。私钥文件id_rsa应该以-----BEGIN RSA PRIVATE KEY-----开头,而不是-----BEGIN OPENSSH PRIVATE KEY-----的标题。

标签: python private-key ssh-tunnel ssh-agent


【解决方案1】:

也许您应该添加私钥

ssh-add ~/.ssh/id_rsa

【讨论】:

    【解决方案2】:

    我已经解决了这个问题。

    就我而言,我的 macOS ~/.ssh/id_rsa-----BEGIN OPENSSH PRIVATE KEY----- 开头,这不是正确的起始行。

    其实ssh_pkey应该以-----BEGIN RSA PRIVATE KEY-----开头。根据sshtunnel模型的源码:

    ssh_pkey (str or paramiko.PKey):
        **Private** key file name (``str``) to obtain the public key
        from or a **public** key (:class:`paramiko.pkey.PKey`)
    

    密钥是paramiko.pkey.PKey,这意味着~/.ssh/id_rsa应该正确转换为paramiko.pkey。

    import paramiko
    pkey='~/.ssh/id_rsa'
    key=paramiko.RSAKey.from_private_key_file(pkey)
    
    # id_rsa with `-----BEGIN OPENSSH PRIVATE KEY-----`
    # raise SSHException: not a valid RSA private key file
    

    所以,我在 linux 操作系统中生成一个新密钥,命令为ssh-keygen -t rsa,然后 我通过ssh-copy-id -i ~/.ssh/id_rsa.pub username@jump_server_host -p ssh_port 授权访问密钥。

    ssh-keygen -t rsa
    ssh-copy-id -i ~/.ssh/id_rsa.pub username@jump_server_host -p ssh_port
    

    现在我的 linux 操作系统上的 ~/.ssh/id_rsa 看起来像:

    -----BEGIN RSA PRIVATE KEY-----
    MIIEpAIBAAKCAQEAuFSEXjLMwyAJ54d5hQQjyIE+4l5pZw7GuYFDgNCzXjl6CNwV
    XXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXX
    -----END RSA PRIVATE KEY-----
    

    将它复制到我的本地mac,并测试它。

    pkey='/path/to/the/new/id_rsa'
    key=paramiko.RSAKey.from_private_key_file(pkey) 
    
    # id_rsa with `-----BEGIN RSA PRIVATE KEY-----`
    # No SSHException now.
    

    现在,它可以正常工作,没有异常 ValueError: No password or public key available!

    with SSHTunnelForwarder(
            ('jump_server_host', jump_ssh_port),  # jump server
            ssh_username='username',
            ssh_pkey="/path/to/new/id_rsa",
            remote_bind_address=('remote_host', remote_ssh_port),  # remote_server
            local_bind_address=('0.0.0.0', 30023)                  # local_bind_port set to 30023, your can select new one 
    ) as server:
        server.start()
        print(server.local_bind_port)
        server.close() 
    

    它输出30023

    【讨论】:

    • 谢谢 Ferris,将密钥格式更改为 PEM 格式(即为您提供BEGIN RSA PRIVATE KEY 的开头行)也为我解决了这个问题。如果您无权访问 Linux 操作系统,您实际上可以将现有的 OPENSSH 密钥就地更改为 PEM,只需一行:ssh-keygen -p -N "new passphrase" -m pem -f /path/to/key。这将使您的公钥保持不变,因此您无需在远程计算机上添加或更改任何内容。通过stackoverflow.com/questions/54994641/….
    【解决方案3】:

    通过在我的机器上运行以下命令,我遇到了类似的问题。我能够解决这个问题。

    $ssh-add ~/.ssh/id_rsa
    

    【讨论】:

    • 欢迎来到 Stack Overflow!我们鼓励平台的所有用户在回答问题时尽可能提供信息。请说明您的方法解决问题的原因,并在可能的情况下提供资源链接以进一步了解该主题。这些只是确保您的答案清晰易懂的几种不同方法。感谢您的参与!
    【解决方案4】:

    如果您还没有找到解决方案,就我而言,问题在于私钥的路径。 而不是使用:

    ssh_pkey="~/.ssh/id_rsa",

    使用(例如)绝对路径

    ssh_pkey="/Users/<your-user>/.ssh/id_rsa",

    根据我的分析,问题在于检查密钥是否存在于 sshtunnel 中: https://github.com/pahaz/sshtunnel/blob/master/sshtunnel.py#L1018

    os.path.exists(ssh_pkey) 在使用~/.ssh/id_rsa 路径时为 False

    【讨论】:

      【解决方案5】:

      请注意,如果您提供的私钥密码无效,也会出现此错误。我刚刚使用 paramiko==2.8.1 进行了测试,我提供了一个乱码密码并得到了相同的错误消息。初始密码来自密码管理器,包含许多特殊字符,因此也值得研究一下。

      【讨论】:

        【解决方案6】:

        我昨天遇到了同样的问题。我以前使用的代码运行良好。但是三个月后它不能在“没有可用的密码或公钥”异常的情况下工作。我发现我的 paramiko 版本是 2.5,所以我将它更新到 2.7。然后代码又可以正常工作了。

        【讨论】:

          猜你喜欢
          • 2022-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-01
          • 2021-05-15
          • 2013-09-12
          相关资源
          最近更新 更多