2017-02-01 9 views
1

Я работаю над приложением scala с SSH2-соединением, используя sshj (0.19.1). Я могу подключиться отлично от затмения, но запустив приложение из толстой банки, я получаю некоторые ошибки. Моя первая ошибка:BouncyCastle требуется для чтения ключа типа ecdsa-sha2-nistp256

Line 3: TransportException: null 
at net.schmizz.sshj.transport.TransportException$1.chain(33) 
at net.schmizz.sshj.transport.TransportException$1.chain(27) 
at net.schmizz.concurrent.Promise.deliverError(96) 
at net.schmizz.concurrent.Event.deliverError(74) 
at net.schmizz.concurrent.ErrorDeliveryUtil.alertEvents(34) 
at net.schmizz.sshj.transport.KeyExchanger.notifyError(386) 
at net.schmizz.sshj.transport.TransportImpl.die(596) 
at net.schmizz.sshj.transport.Reader.run(68) 

Я добавил US_export_policy.jar и local_policy.jar до $ JAVA_HOME/Lib/безопасности. Я добавил следующее, чтобы попытаться зарегистрировать BouncyCastle в качестве поставщика,

import org.bouncycastle.jce.provider.BouncyCastleProvider 
val bouncyCastle = new BouncyCastleProvider() 
java.security.Security.addProvider(bouncyCastle) 
net.schmizz.sshj.common.SecurityUtils.registerSecurityProvider("org.bouncycastle.jce.provider.BouncyCastleProvider") 

, но я все еще получаю следующие ошибки:

INFO n.schmizz.sshj.common.SecurityUtils - Registration of Security Provider 'org.bouncycastle.jce.provider.BouncyCastleProvider' unexpectedly failed 
INFO n.schmizz.sshj.common.SecurityUtils - BouncyCastle not registered, using the default JCE provider 
INFO n.s.sshj.transport.random.JCERandom - Creating new SecureRandom. 
WARN net.schmizz.sshj.DefaultConfig - Illegal key size 
WARN net.schmizz.sshj.DefaultConfig - Cannot find any provider supporting Twofish/CBC/NoPadding 
... 
WARN net.schmizz.sshj.DefaultConfig - Illegal key size or default parameters 
WARN net.schmizz.sshj.DefaultConfig - Disabling high-strength ciphers: cipher strengths apparently limited by JCE policy 
INFO n.s.sshj.transport.TransportImpl - Client identity string: SSH-2.0-SSHJ_0.19.1 
INFO n.s.sshj.transport.TransportImpl - Server identity string: SSH-2.0-OpenSSH_6.6.1 
ERROR n.s.sshj.transport.TransportImpl - Dying because - {} 
net.schmizz.sshj.common.SSHRuntimeException: BouncyCastle is required to read a key of type ecdsa-sha2-nistp256 
    at net.schmizz.sshj.common.Buffer.readPublicKey(Buffer.java:431) 
    at net.schmizz.sshj.transport.kex.AbstractDHG.next(AbstractDHG.java:66) 
    at net.schmizz.sshj.transport.KeyExchanger.handle(KeyExchanger.java:358) 
    at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:493) 
    at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:104) 
    at net.schmizz.sshj.transport.Decoder.received(Decoder.java:172) 
    at net.schmizz.sshj.transport.Reader.run(Reader.java:60) 
Caused by: java.security.GeneralSecurityException: BouncyCastle is required to read a key of type ecdsa-sha2-nistp256 
    at net.schmizz.sshj.common.KeyType$3.readPubKeyFromBuffer(KeyType.java:120) 
    at net.schmizz.sshj.common.Buffer.readPublicKey(Buffer.java:429) 
    ... 6 common frames omitted 
INFO n.s.sshj.transport.TransportImpl - Disconnected - UNKNOWN 
ERROR net.schmizz.concurrent.Promise - <<kex done>> woke to: net.schmizz.sshj.transport.TransportException: BouncyCastle is required to read a key of type ecdsa-sha2-nistp256 

Я бегу банку как java -cp ../lib/bcprov-jdk15on-1.51.jar -jar <my jar>, потому что, как Я понимаю это, вы не можете включить bouncycastle как часть вашей толстой банки как поставщика. Но я не уверен, что мне не хватает, что я не могу зарегистрировать его как поставщика. Любая помощь будет оценена по достоинству.

ответ

1

java -jar игнорирует путь класса из командной строки или envvar и использует вместо этого указанный баннер плюс любой элемент class-path в его манифесте. Либо

  • ссылка bcprov в манифесте фляги в (но делать не слияние поставщика, как bcprov в свою собственную баночку, вы правы на что) или

  • положить bcprov в вашем JRE/lib/ext, поэтому JVM найдет его без использования classpath.

Или работать с java -cp myjar:bcprov mainclassname (; на окнах), который действительно использует путь к классам.

Я бы ожидал, что ваш new BouncyCastleProvider() должен бросить, прежде чем перейти к точке вашего кода, который пытается использовать провайдера, но я не знаю scala и, возможно, здесь все по-другому.

FWIW, если этот проект будет обновлен до 5 лет назад (Java 7), вам не понадобится Bouncy для EC, включая ECDSA. Вы все еще нуждаетесь в этом для Twofish, но я не знаю, кто (а) реализует Twofish, и я был бы поражен, если бы кто-нибудь требует; ваш сервер здесь идентифицирует OpenSSH, который этого не делает.

+0

Спасибо, я попробую это. Когда вы упомянули о java7, это было интересно, потому что я запускаю 1.8.0_121. Я не использовал gradle, поэтому я не знаком с ним на 100%, но я заметил, что в sshj build.gradle на github он использует sourceCompatibility и targetCompatibility = 1.6. Если это причина, по которой мне даже приходится прыгать через эти обручи, я должен пересмотреть эту библиотеку. – bhnat

+1

Спасибо. Копирование bcprov в JRE/lib/ext сделало трюк. Я собираюсь заглянуть, если это то, что sourceCompatibility = 1.6 в sshj сделало это необходимым в первую очередь. Если это так, то я, вероятно, переключусь на другую библиотеку ssh, чтобы упростить ее развертывание клиентам без копирования лишних файлов в их java_home. – bhnat

+0

Комментарий от автора :) (меня): SSHJ использует Java6, потому что есть еще несколько пользователей, которые этого требуют. См. Например: https://github.com/hierynomus/sshj/pull/269. –