我正在尝试使用密钥对将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);
});
答案 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']); // <==============
});