python - sshtunnel 无法识别私钥密码

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

我正在使用 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 的预期参数有什么误解吗?关于 key 和密码的更基本的东西?

最佳答案

我已经解决了这个问题。

在我的例子中,我的 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`)

key 是一个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 操作系统中生成了一个新 key ,命令为 ssh-keygen -t rsa,然后 我使用 ssh-copy-id -i ~/.ssh/id_rsa.pub username@jump_server_host -p ssh_port 授权访问 key 。

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

关于python - sshtunnel 无法识别私钥密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40167788/

相关文章:

异或 (XOR) 加密的安全性

php - 使用 PHP 时使用 socks5 代理的 cURL 请求失败,但它通过命令行工作

windows - 如何在 Windows 中使用 PuTTY 创建 SSH 隧道?

python - 如何使用 python-can 修复损坏的 .blf 文件(来自 Vector 软件)

如果创建了 multiprocessing.Pool,Python 子进程 wait() 将失败

python - 尝试使用统计库计算大数据集的 mode() 时出现统计错误

node.js - chromeos 上的 ssh 隧道连接被拒绝

python - 我可以使用另一个类的方法调用 python 对象的字典吗?

linux - 在 PowerShell 中使用 New-SshSession(使用私钥)远程登录 Linux 失败并显示 "Invalid private key file"

java - 有没有办法使用私钥从签名数据中获取纯文本?