Сервер с аутентификацией по открытому ключу ssh с помощью libssh

Может ли кто-нибудь привести пример с сервером с аутентификацией по открытому ключу ssh с помощью libssh? Я нашел это 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;
}

person Vladislav    schedule 18.01.2015    source источник


Ответы (1)


Это не очень сложно. Однако я предлагаю написать ssh-сервер на основе обратного вызова. См. пример Sampleshd-cb.c в исходном коде libssh.

Аутентификация с открытым ключом:

Сначала прочтите RFC 4252, раздел 7. В нем описывается, как работает аутентификация с открытым ключом. Обратный вызов предоставляет вам открытый ключ и сообщает вам, является ли он зондом открытого ключа или логином.

Итак, сначала вы должны прочитать авторизованные ключи. Обычно у вас есть файл со всеми ключами. Вы используете ssh_pki_import_pubkey_base64() для чтения ключа, а затем вызываете ssh_key_cmp() для сравнения его с открытым ключом, отправленным клиентом. В зависимости от того, является ли это зондом, вы возвращаете частичный успех или успех аутентификации, если это логин.

person asn    schedule 19.01.2015