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

时间:2016-04-27 19:13:28

标签: node.js git ssh libgit2

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

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

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

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

所以,我不确定问题出在哪里:在' publickey'的libgit2实现中。方法类型,或ssh2服务器落入方法类型'无'。

非常感谢任何指针或帮助。感谢。

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);
});

1 个答案:

答案 0 :(得分:1)

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']); // <==============
});