在 ssh2-sftp-client 中使用 ssh 指纹

Using ssh fingerprint in ssh2-sftp-client

好的,这可能需要预先解释一下。

我目前正在使用 node-red 进行自动化项目。 我想使用 ssh 从远程服务器上传和下载文件。对于此任务,我使用名为 node-red-contrib-sftpcthis node-red 包。我稍微重写了库,以便我可以通过移交给节点的有效负载移交 sftp 连接的一些凭据。 要建立连接,使用 ssh2-sftp-clientsftp.connect 方法:

await sftp.connect({ 
    host: node.server.host,
    port: node.server.port,
    username: node.server.username,
    password: node.server.password});

您可以在文档中找到可以为 connect 提供参数 hostHashhostVerifier 的文档。 ssh2-sftp-client 所基于的 documentation of the ssh2 model 指出:

hostHash - string - Any valid hash algorithm supported by node. The host's key is hashed using this algorithm and passed to the hostVerifier function as a hex string. Default: (none)

hostVerifier - function - Function with parameters (hashedKey[, callback]) where hashedKey is a string hex hash of the host's key for verification purposes. Return true to continue with the handshake or false to reject and disconnect, or call callback() with true or false if you need to perform asynchronous verification. Default: (auto-accept if hostVerifier is not set)

所以这是我的问题:如何编写 hostVerifier 函数?我想传递 hashedKeyfingerprint,这样我就可以 return truefalse,无论握手成功与否。 我想检查给定的服务器密钥指纹是否是“正确的”,并且我连接到正确的服务器。

据我了解第二个参数,将是一个回调函数,但我不知道如何使用它,以便它验证握手。 这是我的尝试,或者至少是我尝试的方式。

node.server.hostVerifier = function (hashedKey, (hashedKey, msg.fingerprint)=> {
  if (hashedKey = msg.fingerprint) return true;
  else return false
  }){};

await sftp.connect({ 
    host: node.server.host,
    port: node.server.port,
    username: node.server.username,
    password: node.server.password,
    hostHash: 'someHashAlgo',
    hostVerifier: node.server.hostVerifier,});

我知道这是完全错误的,但我快要发疯了,因为我不知道如何正确检查 ssh 主机密钥指纹。

所以我自己找到了解决办法,想分享给大家。 我定义了一个箭头函数作为 hostVerifier 函数,它通过 msg.fingerprint 变量隐含指纹的值。如果 node.server.fingerprint 有值,我只会这样做。所以如果我手边没有指纹,连接仍然会建立。

node.server.fingerprint = msg.fingerprint;
if(!!node.server.fingerprint){
    node.server.hostHash = 'md5';
    node.server.hostVerifier =  (hashedKey) => {
            return (hashedKey === msg.fingerprint) ;};
    node.server.algorithms = {serverHostKey: ['ssh-rsa'],};
        };

为此我也声明我的 node.server.alogrithms。这是一些尝试和错误。

所以我把所有东西放在一起:

await sftp.connect({ 
                host: node.server.host,
                port: node.server.port,
                username: node.server.username,
                password: node.server.password,
                hostHash: node.server.hostHash,
                hostVerifier: node.server.hostVerifier, 
                algorithms: node.server.algorithms,
                });