Как отключить diffie-hellman-group1-sha1 в ganymed-ssh2-build210.jar
В Java мы используем ganymed-ssh2-build210.jar для подключения к серверу через ssh. Мне нужно специально ограничить более слабый алгоритм " diffie-hellman-group1-sha1 ".
Есть ли в ganymed-ssh2-build210.jar настраиваемые параметры, позволяющие это ограничить?
Есть ли какие-либо настройки java.security для ограничения того же?
2 ответа
Если вы не можете управлять сервером, кроме библиотеки на клиенте.
Ниже может быть вариант
- получить исходный код библиотеки ganymed-ssh2-build210-sources.jar
- изменить
ch/ethz/ssh2/transport/KexManager.java
больше не поддерживатьdiffie-hellman-group1-sha1
- составить исправленный код
- создать исправленную библиотеку как
ganymed-ssh2-build210_1.jar
и использовать этот с клиентским приложением
отредактируйте Найдите пошаговую инструкцию, чтобы проверить вышеупомянутое.
Предположим, следующая структура
bin/
apache-sshd-1.6.0.tar.gz
ganymed-ssh2-build210.jar
ganymed-ssh2-build210-sources.jar
SshClientDemo.java
SshServerDemo.java
- скачать архивы
выбрать зеркало для apache-sshd-1.6.0.tar.gz
Ганимед-ssh2-build210.jar
Ганимед-ssh2-build210-sources.jar
SshServerDemo.java
package sub.optimal;
import java.nio.file.Paths;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.kex.KeyExchange;
import org.apache.sshd.common.util.GenericUtils;
import org.apache.sshd.server.SshServer;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.apache.sshd.server.scp.ScpCommandFactory;
import org.apache.sshd.server.shell.InteractiveProcessShellFactory;
import org.apache.sshd.server.shell.ProcessShellFactory;
public class SshServerDemo extends Thread {
public static void main(String[] args) throws Exception {
Logger.getGlobal().setLevel(Level.FINEST);
SshServer sshd = SshServer.setUpDefaultServer();
sshd.setPort(2222);
sshd.setKeyPairProvider(
new SimpleGeneratorHostKeyProvider(Paths.get("hostkey.ser"))
);
sshd.setShellFactory(InteractiveProcessShellFactory.INSTANCE);
sshd.setCommandFactory(
new ScpCommandFactory.Builder().withDelegate(
cmd -> new ProcessShellFactory(
GenericUtils.split(cmd, ' ')
).create()
).build()
);
List<NamedFactory<KeyExchange>> keyExchangeFactories;
keyExchangeFactories = sshd.getKeyExchangeFactories();
keyExchangeFactories.removeIf(
e -> !e.getName().equals("diffie-hellman-group1-sha1")
);
sshd.setKeyExchangeFactories(keyExchangeFactories);
sshd.setPasswordAuthenticator(
(username, password, session) -> username.equals(password)
);
sshd.start();
Thread.sleep(Long.MAX_VALUE);
}
}
SshClientDemo.java
package sub.optimal;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class SshClientDemo {
public static void main(String[] args) throws Exception {
Connection conn = new Connection("localhost", 2222);
conn.connect();
boolean isAuthenticated = conn.authenticateWithPassword("foo", "foo");
Session sess = conn.openSession();
System.out.println("session is authenticated: " + isAuthenticated);
sess.execCommand("echo I'm there...");
InputStream stdout = new StreamGobbler(sess.getStdout());
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
while (true) {
String line = br.readLine();
if (line == null) {
break;
}
System.out.println(line);
}
sess.close();
conn.close();
}
}
извлечь сервер Apache
tar xzf apache-sshd-1.6.0.tar.gz
скомпилировать демонстрационные классы
javac -cp "apache-sshd-1.6.0/lib/*" -d bin/ SshServerDemo.java javac -cp ganymed-ssh2-build210.jar -d bin/ SshClientDemo.java
извлечь
KexManager.java
jar vxf ganymed-ssh2-build210-sources.jar \ ch/ethz/ssh2/transport/KexManager.java
изменить файл
KexManager.java
public static final String[] getDefaultKexAlgorithmList() { return new String[] { "diffie-hellman-group-exchange-sha1", "diffie-hellman-group14-sha1"// , // "diffie-hellman-group1-sha1" }; } ... public static final void checkKexAlgorithmList(String[] algos) ... if ("diffie-hellman-group14-sha1".equals(algos[i])) continue; // if ("diffie-hellman-group1-sha1".equals(algos[i])) // continue; ...
скомпилировать исправленный
KexManager.java
javac -cp ganymed-ssh2-build210.jar ch/ethz/ssh2/transport/KexManager.java
создать пропатченную библиотеку
cp ganymed-ssh2-build210.jar ganymed-ssh2-build210-patched.jar jar vuf ganymed-ssh2-build210-patched.jar \ ch/ethz/ssh2/transport/KexManager.class
в сеансе командной строки ОДИН
запустить сервер
java -cp "bin/:apache-sshd-1.6.0/lib/*" sub.optimal.SshServerDemo
в сеансе командной строки ДВА
сначала проверьте алгоритмы обмена ключами, поддерживаемые сервером
ssh -vv foo@localhost -p 2222
на выходе только
diffie-hellman-group1-sha1
сообщаетсяdebug2: peer server KEXINIT proposal debug2: KEX algorithms: diffie-hellman-group1-sha1
запустить клиент с непатчированной библиотекой
java -cp bin/:ganymed-ssh2-build210.jar sub.optimal.SshClientDemo
выход
session is authenticated: true I'm there...
запустить клиент с пропатченной библиотекой
java -cp bin/:ganymed-ssh2-build210-patched.jar sub.optimal.SshClientDemo
выход
Caused by: java.io.IOException: Cannot negotiate, proposals do not match.
в журнале сервера
Unable to negotiate key exchange for kex algorithms \ (client: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1 \ / server: diffie-hellman-group1-sha1)
Это доказывает, что SshClientDemo с исправленной библиотекой не может использовать алгоритм обмена ключами diffie-hellman-group1-sha1
подключиться к серверу (который для PoC поддерживает только этот).
Вы хотите изменить разрешенные шифры на сервере, а не на своем клиенте, иначе любой может легко обойти это.
Проверьте ответ: https://unix.stackexchange.com/questions/333728/ssh-how-to-disable-weak-ciphers