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 私钥文件”