sshtunnel 无法识别私钥密码

Posted

技术标签:

【中文标题】sshtunnel 无法识别私钥密码【英文标题】:sshtunnel doesn't recognize private key password 【发布时间】: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-----的标题。 【参考方案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。这将使您的公钥保持不变,因此您无需在远程计算机上添加或更改任何内容。通过***.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。然后代码又可以正常工作了。

【讨论】:

以上是关于sshtunnel 无法识别私钥密码的主要内容,如果未能解决你的问题,请参考以下文章

Paramiko 无法识别 ssh-keygen 生成的 SSH 密钥:“不是有效的 RSA 私钥文件”

Paramiko 无法识别 ssh-keygen 生成的 SSH 密钥:“不是有效的 RSA 私钥文件”

phpMyAdmin 安装程序无法识别自己的密码

win10无法使用面部识别

hikvision人脸识别门禁怎么无法按指纹

基于appium的移动端自动化测试,密码键盘无法识别问题