您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python-pysftp / paramiko-使用指纹验证主机密钥

Python-pysftp / paramiko-使用指纹验证主机密钥

根据您的需要,可以使用以下两种方法之一:

使用ssh-keyscan(或类似方法)检索主机公钥:

ssh-keyscan example.com > tmp.pub

tmp.pub会像(kNown_hosts文件格式):

example.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0hVqZOvZ7yWgie9OHdTORJVI5fJJoH1yEGamAd5G3werH0z7e9ybtq1mGUeRkJtea7bzru0ISR0EZ9HIONoGYrDmI7S+BiwpDBUKjva4mAsvzzvsy6Ogy/apkxm6Kbcml8u4wjxaOw3NKzKqeBvR3pc+nQVA+SJUZq8D2XBRd4EDUFXeLzwqwen9G7gSLGB1hJkSuRtGRfOHbLUuCKNR8RV82i3JvlSnAwb3MwN0m3WGdlJA8J+5YAg4e6JgSKrsCObZK7W1R6iuyuH1zA+dtAHyDyYVHB4FnYZPL0hgz2PSb9c+iDEiFcT/lT4/dQ+kRW6DYn66lS8peS8zCJ9CSQ==

现在,您可以使用以下命令计算该公钥的指纹ssh-keygen

ssh-keygen -l -f tmp.pub -E md5

-E md5仅与支持多种指纹算法且认值为SHA256的OpenSSH的较新版本一起使用)

您将获得类似以下内容的信息:

2048 MD5:c4:26:18:cf:a0:15:9a:5f:f3:bf:96:d8:3b:19:ef:7b example.com (RSA)

如果指纹与您拥有的指纹匹配,则现在可以安全地假定指纹tmp.pub是合法的公共密钥,并在代码中使用它:

from base64 import decodebytes
# ...

keydata = b"""AAAAB3NzaC1yc2EAAAABIwAAAQEA0hV..."""
key = paramiko.RSAKey(data=decodebytes(keydata))
cnopts = pysftp.CnOpts()
cnopts.hostkeys.add('example.com', 'ssh-rsa', key)

with pysftp.Connection(host, username, password, cnopts=cnopts) as sftp:

(基于 使用pysftp验证主机密钥

例如,因为指纹来自外部配置。

我不确定pysftp的有限API是否允许这样做。您可能必须跳过pysftp并直接使用Paramiko(pysftp在内部使用Paramiko)。

使用Paramiko,您可以巧妙地实现MissingHostKeyPolicyinterface

AutoAddPolicy实现方法开始:

class AutoAddPolicy (MissingHostKeyPolicy):
    """
    Policy for automatically adding the hostname and new host key to the
    local `.HostKeys` object, and saving it.  This is used by `.SSHClient`.
    """

    def missing_host_key(self, client, hostname, key):
        client._host_keys.add(hostname, key.get_name(), key)
        if client._host_keys_filename is not None:
            client.save_host_keys(client._host_keys_filename)
        client._log(DEBUG, 'Adding %s host key for %s: %s' %
                    (key.get_name(), hostname, hexlify(key.get_fingerprint())))

请注意,在代码中,您有可用的指纹hexlify(key.get_fingerprint())。只需将该值与您拥有的指纹进行比较即可。如果匹配,请返回。否则引发异常,就像这样RejectPolicy做。

一个解决方案(甚至可以与pysftp一起使用)是通过PKey仅保留指纹的方式实现的。并实现其__cmp__方法仅比较指纹。PKey然后可以将这样的实例添加到中cnopts.hostkeys.add

python 2022/1/1 18:38:37 有554人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶