BouncyCastle требуется для чтения ключа типа ecdsa-sha2-nistp256

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

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/security. Я добавил следующее, чтобы попытаться зарегистрировать 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 игнорирует classpath из командной строки или envvar и использует вместо указанного jar плюс любой class-path пункт в его манифесте. Или

  • ссылаться на bcprov в манифесте jar (но не объединяйте провайдера, такого как bcprov, в свой собственный jar, в этом вы правы) или

  • поместите bcprov в ваш JRE/lib/ext, чтобы JVM нашла его без использования classpath.

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

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

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

Другие вопросы по тегам