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

4

好的,这可能需要一点前置解释。

我目前正在使用node-red进行自动化项目开发。 我想通过ssh从远程服务器上传和下载文件。为此我使用了这个叫做node-red-contrib-sftpc的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});

在文档中可以找到,您可以使用参数hostHashhostVerifier来提供连接。基于ssh2的ssh2-sftp-client模型的文档指出:

hostHash - 字符串 - 任何由节点支持的有效哈希算法。使用此算法对主机的密钥进行哈希处理,并将其作为十六进制字符串传递给hostVerifier函数进行验证。默认值:(无)

hostVerifier - 函数 - 具有参数(hashedKey [,callback])的函数,其中hashedKey是主机密钥的字符串十六进制哈希,用于验证目的。返回true以继续握手或false以拒绝并断开连接,或者在需要执行异步验证时调用callback()以返回true或false。默认值:(如果未设置hostVerifier,则自动接受)

因此,我的问题在于:如何编写hostVerifier函数?我想传递hashedKeyfingerprint,以便在握手成功或失败时返回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主机密钥指纹。

1个回答

2

所以我自己找到了一个解决方案,想要与您分享。 我定义了一个箭头函数作为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,
                });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接