2017-02-16 3 views
1

Невозможно получить доступ к местоположению SFTP с помощью Apache Camel с закрытым ключом.Apache Camel Пользователь SFTP с privateKeyFile дает ошибку SSH_MSG_DISCONNECT: 2 Ошибка протокола: не найдено DH grp найдено

SFTP URI: sftp://[email protected]:22/usr/users/me/inbox/myfolder/?privateKeyFile=ssk-key.pem

файл ключа подтверждается правильным.

Ошибка:

org.apache.camel.component.file.GenericFileOperationFailedException: Cannot connect to sftp://[email protected]:22 
       at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:146) 
       at org.apache.camel.component.file.remote.RemoteFileConsumer.connectIfNecessary(RemoteFileConsumer.java:203) 
       at org.apache.camel.component.file.remote.SftpConsumer.doStart(SftpConsumer.java:52) 
       at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) 
       at org.apache.camel.impl.DefaultCamelContext.startService(DefaultCamelContext.java:3269) 
       at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRouteConsumers(DefaultCamelContext.java:3563) 
       at org.apache.camel.impl.DefaultCamelContext.doStartRouteConsumers(DefaultCamelContext.java:3499) 
       at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3429) 
       at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3197) 
       at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3053) 
       at org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:175) 
       at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:2848) 
       at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:2844) 
       at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:2867) 
       at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:2844) 
       at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) 
       at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:2813) 
       at org.apache.camel.main.Main.doStart(Main.java:127) 
       at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) 
       at org.apache.camel.main.MainSupport.run(MainSupport.java:138) 
       at org.apache.camel.main.MainSupport.run(MainSupport.java:390) 
       at com.me.mypackage.MainApp.main(MainApp.java:27) 
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
       at java.lang.reflect.Method.invoke(Method.java:606) 
       at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
Caused by: com.jcraft.jsch.JSchException: SSH_MSG_DISCONNECT: 2 Protocol error: no matching DH grp found 
       at com.jcraft.jsch.Session.read(Session.java:996) 
       at com.jcraft.jsch.Session.connect(Session.java:323) 
       at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:118) 
       ... 26 more 

ответ

3

EDIT: перед тем ниже, первая проверка которых Java версия вы работаете на. Если это версия 7 или более ранняя версия, попробуйте перейти на JRE 8 и посмотреть, не исчезла ли проблема. Поскольку я отвечаю на это, я столкнулся с ситуацией, когда вещи отказывались работать с Java 7, но отлично работали с 8. Это может иметь какое-то отношение к некоторым настройкам поставщика безопасности по умолчанию.

Оглядываясь на конец трассировки стека, Camel использует библиотеку JSch для FTP через SSH-поддержку. Зная, что это может быть полезно для дальнейшего устранения неполадок, поскольку вы можете найти, какие алгоритмы обмена ключами поддерживаются JSch.

Когда клиент пытается установить безопасное соединение с сервером, список поддерживаемых алгоритмов обменивается, чтобы определить, какие алгоритмы поддерживают как клиент, так и сервер. Затем для обмена ключами выбирается алгоритм.

Судя по сообщению об ошибке, возвращенному с сервера, SFTP-сервер, скорее всего, использует OpenSSH. Часть, где возвращается сообщение об ошибке и разъединители сервер здесь в источнике OpenSSH:

kex->dh = PRIVSEP(choose_dh(min, nbits, max)); 
if (kex->dh == NULL) { 
    sshpkt_disconnect(ssh, "no matching DH grp found"); 
    r = SSH_ERR_ALLOC_FAIL; 
    goto out; 
} 

«DH GRP» означает группу Диффи-Хеллмана. Diffie-Hellman - это метод обмена открытыми ключами. Группы определяют, какие длины клавиш поддерживаются. Некоторые примеры:

  • Группа 1: 768-битный
  • Группа 2: 1024 бит
  • Группа 5: 1536 бит
  • Группа 14: 2048-битовый

В над битом кода C вы замечаете, что в группе DH выполняется поиск минимального количества бит, предпочтительное количество бит (nbits) и максимальное количество бит. Эти номера предоставляются клиентом (JSch в Camel), чтобы указать, что он поддерживает. Затем сервер ищет лучшую группу. Если он не может найти ни одного из этих критериев, он отключается с сообщением no matching DH grp found.

Вы можете найти информацию в этой записке IETF: https://tools.ietf.org/html/rfc4419. Соответствующий бит:

  1. C sends "min || n || max" to S, indicating the minimal acceptable group size, the preferred size of the group, and the maximal group size in bits the client will accept.

  2. S finds a group that best matches the client's request, and sends "p || g" to C.

C является клиентом и S сервером.

Итак, что делать? Сначала проверьте, какая длина открытого ключа соответствует вашему закрытому ключу. Затем запросите информацию о поддерживаемых алгоритмах шифрования , алгоритмы обмена ключами и Группы DH от того, кто управляет SFTP-сервером.Возможно, сервер поддерживает группы с более высоким минимальным ключом, чем длина ключа, которую вы используете. Или наоборот: открытый ключ клиента длиннее максимального, поддерживаемого сервером.

Если люди на стороне сервера являются типом, который устанавливает какой-либо пакет, не понимая, что они делают или настраивают, вам может быть трудно получить информацию. В этом случае вам может быть повезло узнать о поддерживаемых алгоритмах шифрования и обмена ключами с сервера и клиента, выполнив захват сетевого пакета (используя такой инструмент, как Wireshark), но будьте очень осторожны в этом. Вы захотите получить разрешение своего начальника для этого, чтобы оно не было неверно истолковано как попытка победить меры безопасности или подслушивание. Законы и их интерпретация в этом отношении несколько глупо в некоторых странах, мягко говоря.

В зависимости от результата серверу, возможно, потребуется обновить версию OpenSSH или настроить его для дополнительных групп DH; или, возможно, вам нужно выбрать ключ разной длины. Поскольку это может повлиять на уровень безопасности, вам нужно будет получить разрешение операторов SFTP-сервера и того, для кого вы выполняете проект.

Похоже, что Camel позволяет указать, какие криптографические шифры разрешить, с опцией ciphers в URI. Если вы не указали его, используется список по умолчанию из JSch. К сожалению, я не вижу возможности указать, какой алгоритм обмена ключами использовать. Похоже, что JSch поддерживает многие алгоритмы обмена (найденные здесь под ключом обмена: http://www.jcraft.com/jsch/README)

Попробуйте выяснить, какую версию JSch использует ваша версия Camel. Если вы можете обновить Camel, а более новая версия включает более новую версию JSch, попробуйте это сначала. Если вы не можете обновить или уже находитесь в последней версии Camel, посмотрите, какая версия JSch включена, и если вы можете заменить ее более новой версией, не нарушая ее. Вполне возможно, что последняя версия JSch поддерживает то, что раньше не было, и с обновлениями и устареванием определенных алгоритмов и длин ключей из-за уязвимостей безопасности иногда более старые версии клиентов отказываются работать с современными серверами (или наоборот).

также посмотреть, как включить ведение журнала в JSch (кажется, что он не использует рамки по умолчанию, как Log4j или java.util.logging), и попробуйте установить системное свойство javax.net.debug дорожить all (например, с помощью параметр командной строки -Djavax.net.debug=all). Он может предоставить дополнительную информацию.

Удачи. Хотелось бы, чтобы я мог предоставить конкретное решение, но такие проблемы часто требуют обмена информацией между администратором SFTP-сервера и пользователем, поскольку он предполагает знание конфигурации с обеих сторон.

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