2015-11-13 2 views
4

Я надеюсь создать SFTP-сервер в Java с помощью Apache MINA.«Соответствующий тип ключа хозяина не найден» - Apache MINA SFTP-сервер

Это, кажется, начинается нормально, но когда я пытаюсь подключиться к нему с клиентом OpenSSH, я получаю:

$ ssh localhost -p 2222 
Unable to negotiate with ::1: no matching host key type found. Their offer: ssh-dss 
$ ssh -V 
OpenSSH_7.1p1, OpenSSL 1.0.2d 9 Jul 2015 

логов приложений Java:

! java.lang.IllegalStateException: Unable to negotiate key exchange for server host key algorithms (client: [email protected],[email protected],[email protected],[email protected],ssh-rsa-[email protected],ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,ssh-rsa/server: ssh-dss) 
! at org.apache.sshd.common.session.AbstractSession.negotiate(AbstractSession.java:1279) ~[sshd-core-1.0.0.jar:1.0.0] 

Мой зависимости Maven являются:

<dependency> 
    <groupId>org.apache.sshd</groupId> 
    <artifactId>sshd-sftp</artifactId> 
    <version>0.11.0</version> 
</dependency> 

<dependency> 
    <groupId>org.apache.sshd</groupId> 
    <artifactId>sshd-core</artifactId> 
    <version>1.0.0</version> 
</dependency> 

Мой код запуска приложение выглядит (копируется из https://stackoverflow.com/a/8974515/8261)

import org.apache.sshd.common.NamedFactory; 
import org.apache.sshd.server.Command; 
import org.apache.sshd.server.SshServer; 
import org.apache.sshd.server.auth.UserAuth; 
import org.apache.sshd.server.auth.UserAuthNoneFactory; 
import org.apache.sshd.server.command.ScpCommandFactory; 
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; 
import org.apache.sshd.sftp.subsystem.SftpSubsystem; 

private void startSftpServer() throws IOException { 
    SshServer sshd = SshServer.setUpDefaultServer(); 
    sshd.setPort(2222); 
    sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(
      new File("hostkey.ser"))); 

    List<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<NamedFactory<UserAuth>>(); 
    userAuthFactories.add(new UserAuthNoneFactory()); 
    sshd.setUserAuthFactories(userAuthFactories); 

    sshd.setCommandFactory(new ScpCommandFactory()); 

    List<NamedFactory<Command>> namedFactoryList = new ArrayList<NamedFactory<Command>>(); 
    namedFactoryList.add(new SftpSubsystem.Factory()); 
    sshd.setSubsystemFactories(namedFactoryList); 

    sshd.start(); 
} 

Как добавить на сервер более современные алгоритмы ключей хоста?

ответ

10

Это работает для меня:

Изменить Maven pom.xml удалить "Sshd-SFTP", которая теперь является частью "Sshd-ядра":

<dependency> 
    <groupId>org.apache.sshd</groupId> 
    <artifactId>sshd-core</artifactId> 
    <version>1.0.0</version> 
</dependency> 

Добавить в "startSftpServer":

AbstractGeneratorHostKeyProvider hostKeyProvider = 
      new SimpleGeneratorHostKeyProvider(SERVER_KEY_FILE.toPath()); 

    hostKeyProvider.setAlgorithm("RSA"); 
    sshd.setKeyPairProvider(hostKeyProvider); 

... кажется, существует много догадок, связанных с использованием этой библиотеки, которая кажется теневой для «безопасности» lib.

+0

Спасибо, 'setAlgorithm (KeyUtils.RSA_ALGORITHM);' именно то, чего я отсутствовал, пытаясь заставить SSHD работать. Если кто-то получает «не найден соответствующий тип ключа хоста. Их предложение: ssh-dss», попробуйте установить алгоритм главного ключа на RSA! – JeroenHoek

+0

Также не забудьте удалить все ранее сохраненные 'SERVER_KEY_FILE'! –

+0

[Предполагаемое изменение по умолчанию] (https://github.com/apache/mina-sshd/pull/29) –

Смежные вопросы