#java #encryption #ssh #sftp #jsch
#java #шифрование #ssh #sftp #jsch
Вопрос:
Я пытаюсь установить SFTP-соединение, используя Java secure chanel (JSch). Мой программный стек — Red Hat Enterprise Server 5.0, JRE 6.0 и JSch версии 0.1.44. Основным стеком серверного программного обеспечения (к которому я пытаюсь подключиться) является Windows Server 2008 и последняя версия GlobalSCAPE. При попытке подключиться к нему я получаю
com.jcraft.jsch.JSchException: Algorithm negotiation fail
at com.jcraft.jsch.Session.receive_kexinit(Session.java:529)
at com.jcraft.jsch.Session.connect(Session.java:291)
Включив ведение журнала JSch, я получаю следующее для этого же соединения:
0000001d SystemErr R INFO: Connecting to xxx.xxx.xxx.157 port 22
0000001d SystemErr R INFO: Connection established
0000001d SystemErr R INFO: Remote version string: SSH-2.0-1.36_sshlib GlobalSCAPE
0000001d SystemErr R INFO: Local version string: SSH-2.0-JSCH-0.1.44
0000001d SystemErr R INFO: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256- cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256
0000001d SystemErr R INFO: aes256-ctr is not available.
0000001d SystemErr R INFO: aes192-ctr is not available.
0000001d SystemErr R INFO: aes256-cbc is not available.
0000001d SystemErr R INFO: aes192-cbc is not available.
0000001d SystemErr R INFO: arcfour256 is not available.
0000001d SystemErr R INFO: SSH_MSG_KEXINIT sent
0000001d SystemErr R INFO: SSH_MSG_KEXINIT received
0000001d SystemErr R INFO: Disconnecting from xxx.xxx.xxx.157 port 22
Итак, судя по всему, я подключаюсь к серверу и на самом деле могу отправлять и получать сообщения, но когда клиент пытается сопоставить предложения сервера и клиента, он выдает исключение.
Теперь сравниваем его с журналами JSch успешного подключения к серверу с предыдущим программным обеспечением GlobalSCAPE и Windows Server 2003:
0000001e SystemErr R INFO: Connecting to xxx.xxx.xxx.156 port 22
0000001e SystemErr R INFO: Connection established
0000001e SystemErr R INFO: Remote version string: SSH-2.0-1.36 sshlib: GlobalScape
0000001e SystemErr R INFO: Local version string: SSH-2.0-JSCH-0.1.44
0000001e SystemErr R INFO: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256
0000001e SystemErr R INFO: aes256-ctr is not available.
0000001e SystemErr R INFO: aes192-ctr is not available.
0000001e SystemErr R INFO: aes256-cbc is not available.
0000001e SystemErr R INFO: aes192-cbc is not available.
0000001e SystemErr R INFO: arcfour256 is not available.
0000001e SystemErr R INFO: SSH_MSG_KEXINIT sent
0000001e SystemErr R INFO: SSH_MSG_KEXINIT received
0000001e SystemErr R INFO: kex: server->client aes128-cbc hmac-md5 none
0000001e SystemErr R INFO: kex: client->server aes128-cbc hmac-md5 none
0000001e SystemErr R INFO: SSH_MSG_KEXDH_INIT sent
0000001e SystemErr R INFO: expecting SSH_MSG_KEXDH_REPLY
0000001e SystemErr R INFO: ssh_dss_verify: signature true
0000001e SystemErr R WARN: Permanently added 'xxx.xxx.xxx.156' (DSA) to the list of known hosts.
0000001e SystemErr R INFO: SSH_MSG_NEWKEYS sent
0000001e SystemErr R INFO: SSH_MSG_NEWKEYS received
0000001e SystemErr R INFO: SSH_MSG_SERVICE_REQUEST sent
0000001e SystemErr R INFO: SSH_MSG_SERVICE_ACCEPT received
0000001e SystemErr R INFO: Authentications that can continue: publickey,keyboard-inteactive,password
0000001e SystemErr R INFO: Next authentication method: publickey
0000001e SystemErr R INFO: Authentications that can continue: password
0000001e SystemErr R INFO: Next authentication method: password
0000001e SystemErr R INFO: Authentication succeeded (password).
Таким образом, он снова может подключаться и обмениваться SSH_MSG_KEXINIT, но здесь предложения клиента и сервера совпадают, и исключение не выдается
Безопасность sftp заключается в использовании открытого / закрытого ключа и имени пользователя / пароля.
Я могу подключиться к нему с помощью WinSCP, Filezilla и командной строки Linux (с того же сервера, с которого запускается java-приложение).
Я поговорил с одним системным администратором SFTP-сервера, и мы попытались использовать имя пользователя / пароль, и я получаю то же исключение и журналы.
Системный администратор сказал мне, что разница между обоими серверами заключается в версии GlobalSCAPE и в том, что теперь это сервер Microsoft 2008.
Итак, у кого-нибудь есть идеи о том, как справиться с этим?
Заранее большое спасибо!
Комментарии:
1. Правильно ли я понимаю, что основное отличие в настройках заключается в вашей версии GlobalSCAPE? Взгляните на конфигурацию, поддерживает ли новейшая версия aes128-cbc с hmac-md5?
2. Если вы можете запустить свою программу в отладчике, вы могли бы попробовать поставить точку останова в середине
Session.send_keyinit()
, чтобы увидеть значениеciphersc2s
иcipherss2c
. Или поставьте там.log(...)
.3. Да, основным отличием на данный момент в журналах JSch является версия GlobalSCAPE. Я поговорил с системным администратором этого сервера, и он проверяет его. Спасибо за пост.
Ответ №1:
Проблема, с которой вы столкнулись, не имеет ничего общего с globalscape, это сервер SFTP с поддержкой всех алгоритмов шифрования. У каждого sftp-сервера есть некоторые алгоритмы шифрования, с которыми они согласны, поэтому, если у вас нет этих кодировок и алгоритмов для шифрования, это не работает алгоритмы шифрования Все другие программы SFTP имеют встроенные алгоритмы шифрования, которые они используют в соответствии с конфигурацией sftp-сервера, в соответствии с последним 256-битным алгоритмом шифрования, и все готово
https://enterprisedt.com/products/edtftpjssl/doc/manual/html/howtousesftpchoosingalgorithms.html
Алгоритмы с открытым ключом
Для предпочтительных алгоритмов аутентификации с открытым ключом для сервера можно установить либо DSA, либо RSA, либо оба варианта. Если, например, установлен RSA, сервер предоставит клиенту открытый ключ RSA (если сервер, конечно, поддерживает ключи RSA — некоторые серверы этого не делают). Приведенный ниже код иллюстрирует, как установить только RSA. Сначала он отключает все алгоритмы пары ключей, затем включает RSA:
ftp.disableAllAlgorithms (Алгоритм SSHFTPAlgorithm.KEY_PAIR); ftp.setAlgorithmEnabled (Алгоритм SSHFTPAlgorithm.KEY_RSA, true);
По умолчанию включены как DSA, так и RSA.
Алгоритмы шифрования
Алгоритмы шифрования — это симметричные алгоритмы, используемые для выполнения шифрования данных и команд SFTP. Приведенный ниже код иллюстрирует, как установить triple DES в качестве алгоритма шифрования (отключив все остальные):
ftp.disableAllAlgorithms (Алгоритм SSHFTPAlgorithm.ШИФР); ftp.setAlgorithmEnabled (Алгоритм SSHFTPAlgorithm.CIPHER_3DES_CBC, true);
По умолчанию все алгоритмы шифрования включены.