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

Я пытаюсь настроить ssh-сервер, используя apache mina sshd. Я хочу использовать аутентификацию с открытым ключом, и в основном я хочу знать, как реализовать

package org.apache.sshd.server;
import java.security.PublicKey;
import org.apache.sshd.server.session.ServerSession;

public interface PublickeyAuthenticator {

boolean authenticate(String username, PublicKey key, ServerSession session);

}

Я вижу, что передается еще один открытый ключ. Поэтому я предполагаю, что вы должны сравнить открытый ключ, указанный в параметре, с открытым ключом, который есть у сервера. Но я не знаю, как это сделать.

Я нашел одну вещь: это реализация. что кажется бессмысленным, так как сравнивает модуль открытого ключа с самим собой. Если предположить, что в этой реализации есть ошибка и она должна сравнивать модули каждого открытого ключа, достаточно ли этого для аутентификации, чтобы модули согласовывались? Конечно, если бы я просто передал этой функции свой общедоступный открытый ключ, я бы прошел аутентификацию?


person northshorefiend    schedule 12.03.2013    source источник


Ответы (2)


Я думаю, что нашел ответ в источнике org.apache.sshd.server.auth.UserAuthPublicKey#auth. Этот класс выполняет фактическую аутентификацию с помощью ключа. Думаю, меня смутило название метода - authenticate(). На самом деле происходит следующее:

  • Сервер запрашивает открытый ключ клиента

  • Открытый ключ передается PublickeyAuthenticator#authenticate

  • Все, что вам нужно сделать в authenticate(), это проверить, что это открытый ключ, который вы хотите разрешить.

  • Если authenticate() возвращает true, то UserAuthPublicKey#auth проверит, подписано ли сообщение закрытым ключом. Если это так, то аутентификация была подтверждена.

person northshorefiend    schedule 13.03.2013

Приведенный ниже код является примером выполнения аутентификации с открытым ключом с использованием Apache MINA SSHD. Пример кода создает SFTP-сервер.

import java.io.File;
import java.io.IOException;
import java.util.Collections;

@Service
public class MySftpServer {

    private Log log = LogFactory.getLog(MySftpServer.class);

    @PostConstruct
    public void startServer() throws IOException {
        start();
    }

    private void start() throws IOException {
        SshServer sshd = SshServer.setUpDefaultServer();
        sshd.setHost("localhost");
        sshd.setPort(2222);
        sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(new File("host.ser")));
        sshd.setSubsystemFactories(Collections.singletonList(new SftpSubsystemFactory()));
        sshd.setPasswordAuthenticator((username, password, session) -> username.equals("test") && password.equals("password"));
        sshd.setPublickeyAuthenticator(new AuthorizedKeysAuthenticator(new File("<Location of authorized_keys file>")));
        sshd.start();
        log.info("SFTP server started");
    }
}

Подобно тому, что @northshorefiend упомянул в своем ответе, в этом случае AuthorizedKeysAuthenticator берет открытый ключ, переданный на сервер, и проверяет его на соответствие файлу author_keys new AuthorizedKeysAuthenticator(new File("<Location of authorized_keys file>") . Если указанный открытый ключ существует в файле, он проходит аутентификацию.

Вы можете прочитать более подробную информацию об этом здесь и здесь

person Sai Upadhyayula    schedule 03.09.2019
comment
Привет, я пробовал это, но я продолжаю получать эту ошибку: test@localhost: Отказано в доступе (клавиатура-интерактивная, общедоступная). Что я делаю не так? Вот как я пытаюсь подключиться: $ sftp -oPort=2222 test@localhost из каталога, где находится мой закрытый ключ - person Dinu Nicolae; 03.07.2020