Я пытаюсь сделать SFTP через Java-код, используя JSCH jar. Используемая версия баночки JSCH - 0.1.55. Запись внутри нашего файла pom.xml:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
Сервер, к которому я пытаюсь подключиться, - это сервис, предоставляемый через службу конечных точек интерфейса VPC, предоставляемую AWS. Клиент, который пытается выполнить SFTP через этот VPC, является экземпляром EC2.
Я сталкиваюсь с ошибкой
com.jcraft.jsch.JSchException: Algorithm negotiation fail
at com.jcraft.jsch.Session.receive_kexinit(Session.java:590)
at com.jcraft.jsch.Session.connect(Session.java:320)
Предыдущие журналы, в которых перечислены различные алгоритмы, представленные на сервере и клиенте,
2019-03-14 08:50:54,501 INFO [main] Transporter - Remote version string: SSH-2.0-OpenSSH_7.4
2019-03-14 08:50:54,501 INFO [main] Transporter - Local version string: SSH-2.0-JSCH-0.1.54
2019-03-14 08:50:54,501 INFO [main] Transporter - CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256
2019-03-14 08:50:54,547 INFO [main] Transporter - CheckKexes: diffie-hellman-group14-sha1,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521
2019-03-14 08:50:54,590 INFO [main] Transporter - ecdh-sha2-nistp256 is not available.
2019-03-14 08:50:54,590 INFO [main] Transporter - ecdh-sha2-nistp384 is not available.
2019-03-14 08:50:54,590 INFO [main] Transporter - ecdh-sha2-nistp521 is not available.
2019-03-14 08:50:54,590 INFO [main] Transporter - CheckSignatures: ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
2019-03-14 08:50:54,592 INFO [main] Transporter - ecdsa-sha2-nistp256 is not available.
2019-03-14 08:50:54,593 INFO [main] Transporter - ecdsa-sha2-nistp384 is not available.
2019-03-14 08:50:54,593 INFO [main] Transporter - ecdsa-sha2-nistp521 is not available.
2019-03-14 08:50:54,593 INFO [main] Transporter - SSH_MSG_KEXINIT sent
2019-03-14 08:50:54,593 INFO [main] Transporter - SSH_MSG_KEXINIT received
2019-03-14 08:50:54,593 INFO [main] Transporter - kex: server: curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha256,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
2019-03-14 08:50:54,593 INFO [main] Transporter - kex: server: ecdsa-sha2-nistp256,ssh-ed25519
2019-03-14 08:50:54,593 INFO [main] Transporter - kex: server: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,arcfour
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: server: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,arcfour
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: server: hmac-sha1,hmac-ripemd160
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: server: hmac-sha1,hmac-ripemd160
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: server: none,zlib@openssh.com
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: server: none,zlib@openssh.com
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: server:
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: server:
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: client: diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: client: ssh-rsa,ssh-dss
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-ctr,aes192-cbc,aes256-ctr,aes256-cbc
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-ctr,aes192-cbc,aes256-ctr,aes256-cbc
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96
2019-03-14 08:50:54,594 INFO [main] Transporter - kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96
2019-03-14 08:50:54,595 INFO [main] Transporter - kex: client: none
2019-03-14 08:50:54,595 INFO [main] Transporter - kex: client: none
2019-03-14 08:50:54,595 INFO [main] Transporter - kex: client:
2019-03-14 08:50:54,595 INFO [main] Transporter - kex: client:
Как видно из приведенных выше журналов, алгоритмы HostKeyAlgorithm на конечной точке VPC (сервер): ecdsa-sha2-nistp256, ssh-ed25519 и алгоритмы HostKeyAlgorithms на экземпляре EC2 (клиент): SSH-RSA, SSH-ДСС .
Поскольку между сервером и клиентом нет общего алгоритма для выполнения проверки хоста, он завершается сбоем из-за сбоя согласования алгоритма.
Наиболее рекомендуемое решение по установке файлов политики неограниченной силы JCE было опробовано, но не решило проблему. Я установил фляги политики JCE в расположении $ JAVA_HOME / jre / lib / security на экземпляре EC2 (клиент).
Подробная информация о коде с использованием JSCH для SFTP и дальнейшей отладке в банке JSCH.
Я выполнил команду
ssh -Q key
для получения доступных алгоритмов ключей хоста в среде экземпляра (клиента) EC2. (Это было сделано, чтобы подтвердить, что алгоритмы присутствуют в среде.) Вывод был
ssh-ed25519
ssh-ed25519-cert-v01@openssh.com
ssh-rsa
ssh-dss
ecdsa-sha2-nistp256
ecdsa-sha2-nistp384
ecdsa-sha2-nistp521
ssh-rsa-cert-v01@openssh.com
ssh-dss-cert-v01@openssh.com
ecdsa-sha2-nistp256-cert-v01@openssh.com
ecdsa-sha2-nistp384-cert-v01@openssh.com
ecdsa-sha2-nistp521-cert-v01@openssh.com
Создается объект com.jcraft.jsch.Session mSession , и перед вызовом mSession.connect (int timeOut) я напечатал HostKeyAlgorithms, присутствующие в конфигурации mSession объект, использующий
mSession.getConfig("server_host_key")
Вывод был
ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
Внутри вызова mSession.connect () (этот вызов функции находится в банке JSCH), вызывается функция this.send_kexinit () . Внутри этой функции send_kexinit () приведенный ниже код является тем, который устанавливает окончательные HostKeyAlgorithms.
String server_host_key = this.getConfig("server_host_key");
String[] not_available_shks = this.checkSignatures(this.getConfig("CheckSignatures"));
if (not_available_shks != null && not_available_shks.length > 0) {
server_host_key = Util.diffString(server_host_key, not_available_shks);
if (server_host_key == null) {
throw new JSchException("There are not any available sig algorithm.");
}
}
Функция checkSignatures () проверяет список алгоритмов из этого списка this.getConfig ("CheckSignatures") и проверяет, присутствуют они или нет. CheckSignatures () выглядит следующим образом
private String[] checkSignatures(String sigs) {
if (sigs != null && sigs.length() != 0) {
if (JSch.getLogger().isEnabled(1)) {
JSch.getLogger().log(1, "CheckSignatures: " + sigs);
}
Vector result = new Vector();
String[] _sigs = Util.split(sigs, ",");
for(int i = 0; i < _sigs.length; ++i) {
try {
JSch var10000 = this.jsch;
Class c = Class.forName(JSch.getConfig(_sigs[i]));
Signature sig = (Signature)((Signature)c.newInstance());
sig.init();
} catch (Exception var7) {
result.addElement(_sigs[i]);
}
}
if (result.size() == 0) {
return null;
} else {
String[] foo = new String[result.size()];
System.arraycopy(result.toArray(), 0, foo, 0, result.size());
if (JSch.getLogger().isEnabled(1)) {
for(int i = 0; i < foo.length; ++i) {
JSch.getLogger().log(1, foo[i] + " is not available.");
}
}
return foo;
}
} else {
return null;
}
}
this.getConfig ("CheckSignatures") функция вернула список ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521 и при вызове вышеупомянутой функции в этом списке алгоритмы не были найдены, так как они печатаются в журнале как
ecdsa-sha2-nistp256 is not available.
ecdsa-sha2-nistp384 is not available.
ecdsa-sha2-nistp521 is not available.
Понятно, что в блоке try в функции checkSignatures () происходит сбой вызова, поэтому они были добавлены в список недоступен . Из-за этого эти 3 алгоритма удаляются из списка HostKeyAlgorithms. Итак, список
this.getConfig("server_host_key")
после прохождения метода checkSignatures () имеет только
ssh-rsa,ssh-dss
Я не могу понять, почему происходит сбой блока try, так как в файле com.jcraft.jsch.JSch.java в конфигурацию класса JSch добавлены 3 вышеупомянутых алгоритма.
config.put("CheckSignatures", "ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521");
config.put("signature.dss", "com.jcraft.jsch.jce.SignatureDSA");
config.put("signature.rsa", "com.jcraft.jsch.jce.SignatureRSA");
config.put("keypairgen.dsa", "com.jcraft.jsch.jce.KeyPairGenDSA");
config.put("keypairgen.rsa", "com.jcraft.jsch.jce.KeyPairGenRSA");
config.put("keypairgen.ecdsa", "com.jcraft.jsch.jce.KeyPairGenECDSA");
config.put("ecdsa-sha2-nistp256", "com.jcraft.jsch.jce.SignatureECDSA256");
config.put("ecdsa-sha2-nistp384", "com.jcraft.jsch.jce.SignatureECDSA384");
config.put("ecdsa-sha2-nistp521", "com.jcraft.jsch.jce.SignatureECDSA521");
config.put("server_host_key", "ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521");
и классы с именами com.jcraft.jsch.jce.SignatureECDSA256 , com.jcraft.jsch.jce.SignatureECDSA384 и com.jcraft.jsch.jce. Подпись ECDSA521 присутствует в соответствующих местах внутри файла JAR.
Поэтому мне не ясно, почему происходит сбой блока try внутри функции checkSignatures (), даже если классы присутствуют в банке JSCH, а файлы политики неограниченной силы JCE установлены в $ JAVA_HOME / jre / lib / security путь правильно. (Установленные файлы политики были для JDK 1.8, поскольку наша используемая версия JDK - 1.8)
Может ли кто-нибудь помочь мне понять, почему эти алгоритмы (ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521) (особенно ecdsa-sha2-nistp256) появляются как недоступные, (Поскольку очевидно, что добавление ecdsa-sha2-nistp256 в список доступных алгоритмов HostKeyAlgorithm на стороне клиента даст общий алгоритм для сервера и клиента для согласования.)
Редактировать:
Эта проблема была решена, когда мы добавили алгоритмы обмена ключами на стороне сервера путем добавления следующей строки в файл sshd_config и перезапуска службы sshd.
KexAlgorithms ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
Алгоритмы ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521
при добавлении сделали ошибку
ecdsa-sha2-nistp256 is not available.
ecdsa-sha2-nistp384 is not available.
ecdsa-sha2-nistp521 is not available.
исчезнувшей.Все еще исследуем, какова связь между этими алгоритмами обмена ключами и алгоритмами HostKey.