Исключение JSch: Ошибка при сбое согласования алгоритма: JSCH версия 0.1.55 - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь сделать 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.

...