"JCE не может аутентифицировать провайдера BC" при использовании sshj

71
8

Я пытаюсь использовать библиотеку sshj для создания SFTP-клиента в существующем проекте моей компании. Однако, если я создаю экземпляр SSHClient я получаю сообщение об ошибке:

[main] INFO net.schmizz.sshj.common.SecurityUtils - Registration of Security Provider 'org.bouncycastle.jce.provider.BouncyCastleProvider' unexpectedly failed
java.lang.SecurityException: JCE cannot authenticate the provider BC
at javax.crypto.JceSecurity.getInstance(JceSecurity.java:118)
at javax.crypto.KeyAgreement.getInstance(KeyAgreement.java:270)
at net.schmizz.sshj.common.SecurityUtils.registerSecurityProvider(SecurityUtils.java:88)
at net.schmizz.sshj.common.SecurityUtils.register(SecurityUtils.java:267)
at net.schmizz.sshj.common.SecurityUtils.isBouncyCastleRegistered(SecurityUtils.java:245)
at net.schmizz.sshj.DefaultConfig.<init>(DefaultConfig.java:79)
at net.schmizz.sshj.SSHClient.<init>(SSHClient.java:134)
[... junit stacktrace ...]
Caused by: java.util.jar.JarException: Class is on the bootclasspath
at javax.crypto.JarVerifier.verify(JarVerifier.java:286)
at javax.crypto.JceSecurity.verifyProviderJar(JceSecurity.java:164)
at javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:190)
at javax.crypto.JceSecurity.getInstance(JceSecurity.java:114)
... 40 more
[main] INFO net.schmizz.sshj.common.SecurityUtils - BouncyCastle not registered, using the default JCE provider
[main] INFO net.schmizz.sshj.transport.random.JCERandom - Creating new SecureRandom.

Приложение использует Maven для включения зависимостей, и я добавил его так:

<dependency>
<groupId>com.hierynomus</groupId>
<artifactId>sshj</artifactId>
<version>0.27.0</version>
</dependency>

Библиотека sshj включает в себя зависимости bouncycastle (BC) для bcpkix-jdk15on v1.60 и bcprov-jdk15on v1.60, и я попробовал следующие решения:

Добавьте поставщика BC самостоятельно, включите JAR файлы sshj и BC непосредственно в качестве библиотеки и используйте предоставленную область действия в maven, как указано здесь. После этого провайдер добавляется правильно, но все равно происходит сбой с сообщением об ошибке сверху. Поместите JAR файлы BC в папку jre/lib/ext. Измените файл java.security, как указано здесь. Проверьте, есть ли другая версия BC на пути к классам, как указано здесь.

Однако, если я создаю свежий проект и включаю sshj, все работает просто отлично и, как и ожидалось. Я сравнил команды, которые выполняют мой тест junit, в котором создается SSHClient, и в обоих проектах я могу найти sshj JAR и BC JAR, включенные в -classpath.

Я новичок в Maven и Spring, так что я могу упустить что-то, очевидно, почему все хорошо в новом проекте, а не в существующем, но я просто не могу понять это.

Если вам нужна дополнительная информация, я с удовольствием предоставлю их!

спросил(а) 2019-02-14T12:29:00+03:00 9 месяцев, 3 недели назад
1
Решение
45

В Java есть 2 пути к классам, bootclasspath и обычный bootclasspath к classpath. Загрузочный путь - это место, где находятся java.* И javax.* (Jre/lib/rt.jar). Но поскольку он не загружается системным загрузчиком классов, он не поддерживает добавление подписанных/проверенных файлов JAR. Вы должны убедиться, что баночки BouncyCastle находятся на обычном пути к классам (как указано с помощью опции -classpath в JRE/JDK

ответил(а) 2019-02-15T14:33:00+03:00 9 месяцев, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема