Python Twisted: twisted conch 文件传输 验证主机密钥

0 投票
1 回答
538 浏览
提问于 2025-04-16 14:34

我在这里玩弄一个sftp的例子:Stackoverflow: twisted conch filetransfer

我用这个方法来连接。这样我就可以用字符串中的密钥,而不是用密码或者~/.ssh里的密钥。现在我想提供一个主机密钥或者主机密钥的指纹,以避免提示用户去验证主机密钥。

def sftp(user, host, port, key, hostkey):
    options = ClientOptions()
    options['key'] = keys.Key.fromString(key.strip()).keyObject
    options['host'] = host
    options['port'] = port
    conn = SFTPConnection()
    conn._sftp = Deferred()
    auth = SSHUserAuthClient(user, options, conn)
    connect(host, port, options, verifyHostKey, auth)
    return conn._sftp

我尝试给verifyHostkey函数传一些参数,正如你在它的源代码中看到的,fingerprint这个参数并没有被使用,而且我也没找到transport的有效值。

def verifyHostKey(transport, host, pubKey, fingerprint):
     """        
     Verify a host's key.
     ....

有没有什么办法可以让用户不被提示去验证主机密钥,而不需要把主机密钥写入~/.ssh/known_hosts文件里?

好的,我根据Jean-Paul Calderone的回答写了一个函数。这个函数比较简单,但效果不错。我的目标是省去known-host文件的需求。我希望所有的密钥都只存在于内存中。

def verifyHostKey(transport, host, pubKey, fingerprint):
    keytype, key = transport.factory.options['hostkey'].split(" ")[1:]
    hostkey = keytype + " " + key
    key = Key.fromString(hostkey)
    if key.fingerprint() == fingerprint:
       return succeed(True)
    else:
       raise BadKeyError

1 个回答

3

我尝试给 verifyHostKey 提供一些参数。

你是说你自己尝试调用 verifyHostKey 吗?听起来这样做并不能帮你避免让用户输入未知的主机密钥。相反,你需要为 connect 这个参数传递一个不同的函数。不要使用 twisted.conch.client.default 提供的 verifyHostKey 函数,而是用一个类似这样的函数:

from twisted.internet.defer import succeed

def verifyHostKey(transport, host, pubKey, fingerprint):
    return succeed(True)

或者,如果你想自己实现检查,而不是随便接受任何主机密钥,可以定义一个包含检查逻辑的函数。返回一个 Deferred 对象,如果检查成功,就用 True 来触发这个 Deferred;如果检查失败,就用 False 来触发它。

撰写回答