Paramiko:从公钥字符串创建PKey

时间:2013-03-30 19:39:24

标签: python ssh paramiko ssh-keys

我正在尝试在低级别使用SSH协议(即我不想启动shell或任何东西,我只想传递数据)。因此,我直接使用Paramiko的Transport课程。

我已经完成了服务器方面的工作,但现在我正在用愚蠢的东西撞墙。为了让客户端连接到服务器,Transport的{​​{3}}将两个connect method对象作为参数:客户端的私钥(pkey),以及服务器的公钥(hostkey)。

PKey类被描述为“公钥的基类”。然而问题是我无法弄清楚如何用ssh公钥(即字符串ssh-whatever AAblablabla)创建这样的PKey对象。它有从私钥构建这样一个对象的方法,但显然我不希望客户端知道服务器的私钥。

我觉得我忽略了一些简单的事情,但我无法在网上找到这方面的信息;大多数教程都使用更高级PKey加载系统的known_hosts键。

3 个答案:

答案 0 :(得分:4)

必须在另一个不仅仅用于密钥比较的环境中再次解决这个问题(它用于签名检查)。这是正确的方法。回想起来,这很简单,但几乎没有记录。

# For a public key "ssh-rsa AAblablabla...":
key = paramiko.RSAKey(data=base64.b64decode('AAblablabla...'))
key.verify_ssh_sig(..., ...)

答案 1 :(得分:1)

通过调用connect method documentation

中描述的各个方法来解决它
clientPrivateKey = paramiko.RSAKey.from_private_key_file(...)
transport = paramiko.Transport(...)
knownServerKey = 'ssh-rsa AAblablabla'.split(' ', 3)
transport.start_client()
serverKey = transport.get_remote_server_key()
if serverKey.get_name() == knownServerKey[0] and serverKey.get_base64() == knownServerKey[1]:
    # Valid key
    transport.auth_publickey('username', clientPrivateKey)
    channel = transport.open_channel('...')
else:
    # Invalid key

这或多或少what the connect method does anyway

我仍然愿意接受更好/更短的建议。就目前而言,hostkey方法的connect参数似乎无法使用。

答案 2 :(得分:0)

要添加到为传输客户端提供的解决方案中。这是我为SSH客户端添加字符串公共密钥的解决方案:

my_pub_key = "xx.xx.xx.xx ecdsa-sha2-nistp256 mlzdHAyNT....."
my_host = my_pub_key.split(' ')[0]
password = 'myFavortitePassword'
username = 'myUsername'

ssh_client=paramiko.SSHClient()

host_key_policy = paramiko.MissingHostKeyPolicy()
host_key_policy.missing_host_key(ssh_client, my_host, my_pub_key)

ssh_client.connect(hostname= my_host
                            ,username=username
                            ,password=password
                            ,port=22
                            ,look_for_keys=False)