繁体   English   中英

节点ssh2服务器不接受Objective-Git / libgit2 SSH连接

[英]Node ssh2 server not accepting Objective-Git/libgit2 SSH connection

我正在尝试使用密钥对通过SSH将Objective-Git / libgit2应用程序连接到运行mscdex的Node ssh2服务器的远程服务器。

libgit2应用程序可以连接到服务器上的sshd并实现推送。 它正在实现libgit2的git_cred_ssh_key_new然后是git_remote_connect

但是,当应用尝试连接到ssh2服务器时,该服务器接受ssh-userauth服务,但是在ssh-connection服务中,方法类型为“ none”,而不是“ publickey”。

或者,当我使用git(而不是通过libgit2的应用程序)连接到ssh2服务器时,ssh2服务器接受ssh-connection服务并实现方法类型“ publickey”。

因此,我不确定问题出在哪里:是'publickey'方法类型的libgit2实现,还是ssh2服务器陷入了方法类型'none'。

任何指针或帮助,我们将不胜感激。 谢谢。

ssh2服务器(示例服务器):

new ssh2.Server({
  hostKeys: [fs.readFileSync('/Users/almccann/Sites/thenewpop/ssh2server/host_rsa')],
  debug: function (cfg) {
    console.log('debug', cfg);
  }
}, function(client) {
  console.log('Client connected!');
  client.on('authentication', function(ctx) {
    // ctx.method === 'none', no ctx.key
    if (ctx.method === 'publickey'
         && ctx.key.algo === pubKey.fulltype
         && buffersEqual(ctx.key.data, pubKey.public)) {
      if (ctx.signature) {
        var verifier = crypto.createVerify(ctx.sigAlgo);
        verifier.update(ctx.blob);
        if (verifier.verify(pubKey.publicOrig, ctx.signature))
          ctx.accept();
        else
          ctx.reject();
      } else {
        ctx.accept();
      }
    } else
      ctx.reject();
  }).on('ready', function() {
    console.log('Client authenticated!');
  }).on('end', function() {
    console.log('Client disconnected');
  });
})
.listen(22, '127.0.0.1', function() {
  console.log('Listening on port ' + this.address().port);
});

基本上, none身份验证方法听起来很像,它只是一种允许客户端访问服务器而无需提供任何种类的凭据或其他信息的身份验证方法。 这就是为什么在这种情况下没有ctx.key的原因。

拒绝身份验证方法时,大多数服务器会将有效的身份验证方法中继回客户端,但这不是必需的(尽管某些客户端特别依赖于此,这实际上是一件坏事)。 假设ssh客户端需要此列表,则可以执行以下操作以表明您仅接受publickey身份验证:

client.on('authentication', function(ctx) {
  if (ctx.method === 'publickey'
      && ctx.key.algo === pubKey.fulltype
      && buffersEqual(ctx.key.data, pubKey.public)) {
    if (ctx.signature) {
      var verifier = crypto.createVerify(ctx.sigAlgo);
      verifier.update(ctx.blob);
      if (verifier.verify(pubKey.publicOrig, ctx.signature))
        ctx.accept();
      else
        ctx.reject();
    } else {
      ctx.accept();
    }
  } else
    ctx.reject(['publickey']); // <==============
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM