1

有人可以举一个使用 libssh 进行 ssh 公钥身份验证的服务器示例吗?我找到了这个https://github.com/substack/libssh/blob/master/examples/samplesshd-tty.c,但它是使用密码进行的身份验证。可能有人见过这样的例子,但在 libssh 上使用公钥认证。或者可能有人可以更改下面的代码来获取它。

我将此添加到 switch(ssh_message_subtype(message))

                  case SSH_AUTH_METHOD_PUBLICKEY:
                        printf("User %s wants to auth with key %s\n",
                               ssh_message_auth_user(message),
                               ssh_message_auth_pubkey(message));
                        if(authenticate_pubkey(session, message)){
                            ssh_message_auth_reply_success(message,0);
                            ssh_message_free(message);
                            return 1;
                        }
                        ssh_message_auth_set_methods(message,
                                                     SSH_AUTH_METHOD_PUBLICKEY);
                        // not authenticated, send default message
                        ssh_message_reply_default(message);
                        break;

还有这个

static int authenticate_pubkey(ssh_session session, ssh_message message)
{
    int rc;
    std::string us =  ssh_message_auth_user(message);
    rc = ssh_userauth_publickey_auto(session, ssh_message_auth_user(message), NULL);
    if (rc == SSH_AUTH_ERROR)
    {
        fprintf(stderr, "Authentication failed: %s\n",
                ssh_get_error(session));
        return SSH_AUTH_ERROR;
    }
    return rc;
}
4

1 回答 1

1

这并不难。但是我建议编写一个基于回调的 ssh 服务器。请参阅 libssh 源代码中的 samplesshd-cb.c 示例。

公钥认证:

首先阅读 RFC 4252 第 7 节。它描述了公钥身份验证的工作原理。回调为您提供公钥并告诉您它是对公钥的探测还是登录。

所以首先你必须阅读授权密钥。通常,您有一个包含所有密钥的文件。您使用 ssh_pki_import_pubkey_base64() 读取密钥,然后调用 ssh_key_cmp() 将其与客户端发送的公钥进行比较。取决于它是否是一个探测,如果它是一个登录,则返回部分成功或身份验证成功。

于 2015-01-19T13:19:14.520 回答