Как реализовать надувной замок в одну банку?
Я использую SSHJ-библиотеку в проекте. Библиотека SSHJ использовала крипто-бодрящий замок.
В eclipse все хорошо, но после того, как я использую one-jar для упаковки всего в один jar пакет, у меня возникают проблемы с bouncycastle lib. Файл bcprov-jdk15on-1.51.jar включен в пакет JAR в /lib, где находятся все остальные библиотеки, а также, например,. sshj.jar.
На логе у меня есть такие:
Класс провайдера безопасности 'org.bouncycastle.jce.provider.BouncyCastleProvider' не найден
и это
ВНИМАНИЕ: Отключение высокопрочных шифров: сильные стороны шифров, очевидно, ограничены политикой JCE
И с функциональностью соединение SFTP приводит к:
net.schmizz.sshj.transport.TransportException: Невозможно достичь урегулирования: [diffie-hellman-group1-sha1, diffie-hellman-group-exchange-sha1] и [diffie-hellman-group-exchange-sha256]
Что я пробовал:
- Установил Java JCE в /lib/security
- Не уверены, почему вышеупомянутое сообщение все еще всплывает об отключенных высокопрочных шифрах?
- Попробовал "Security.addProvider(новый BouncyCastleProvider());" в коде
Вот как все работает "как положено":
- Поместив "bcprov-jdk15on-1.51.jar" в JAVA_HOME\lib\ext\
- к сожалению, это последний вариант для меня. У меня будет огромная головная боль, чтобы поддерживать библиотеки в ситуациях обновления версии Java.
Итак, очевидно, что есть некоторая проблема с classpath в библиотеке BC? Где-то я читал что-то о подписанной библиотеке провайдера безопасности, имеющей проблемы с реализацией, не совсем понял, что это... Может, в этом тоже причина?
Есть идеи, как решить эту проблему? Любая помощь по этому вопросу приветствуется, спасибо!
РЕДАКТИРОВАТЬ: Мой build.xml с предложенной подписью кода реализовано:
<target name="package_x" depends="package_y">
<!-- Create manifest file for x -->
<delete file="MANIFEST.MF"/>
<manifest file="MANIFEST.MF">
<attribute name="Main-Class" value="com.simontuffs.onejar.Boot"/>
<attribute name="One-Jar-Main-Class" value="com.some.main.class.name"/>
<attribute name="Class-Path" value="some_other_libs lib/bcprov-jdk15on.jar ." />
</manifest>
<!-- Copy properties file -->
<copy todir="${module.dist.dir}">
<fileset dir="${module.x.build.dir}/classes">
<include name="**/*.properties"/>
</fileset>
</copy>
<signjar destDir="${basedir}/distribute/lib/"
alias="server" keystore="${module.x.src.dir}/keystore/myCSC.jks"
storepass="pass"
preservelastmodified="true">
<path>
<fileset dir="${basedir}/distribute/lib/" includes="bcprov-jdk15on.jar" />
</path>
<flattenmapper />
</signjar>
<!-- Construct the One-JAR file -->
<echo message="Creating a ONE-jar package of the x files..." />
<one-jar destfile="${module.dist.dir}/${module.x.package}" manifest="MANIFEST.MF">
<main>
<fileset dir="${module.x.build.dir}/classes/">
<exclude name="x-config.properties"/>
</fileset>
</main>
<lib>
<fileset dir="${basedir}/distribute/lib/" />
<fileset dir="${module.common.dist.dir}" />
</lib>
</one-jar>
<signjar destDir="${module.dist.dir}"
alias="server" keystore="${module.agent.src.dir}/keystore/myCSC.jks"
storepass="pass"
preservelastmodified="true">
<path>
<fileset dir="${module.dist.dir}" includes="**/*.jar" />
</path>
<flattenmapper />
</signjar>
</target>
2 ответа
Отвечая на мой вопрос:
Два решения:
- Добавить библиотеку в Java lib/ext
- это действительно не было решением для меня, но могло бы работать для кого-то еще.
- Используйте JDotSoft JarClassLoader
- Простой в использовании и обеспечивает поддержку добавления JCE-провайдеров, таких как Bouncycastle.
- добавили BC-jar в основной JAR с помощью Ant build:
<zipfileset dir="/build/libsToInclude/" includes="*.jar" prefix="lib/"/>
и загрузчик сделал все остальное.
Для реализации криптографического провайдера необходим, чтобы баночка была подписана
Если ваш поставщик предоставляет алгоритмы шифрования через
Cipher
KeyAgreement
,KeyGenerator
,Mac
, или жеSecretKeyFactory
классы, вам нужно будет подписать свой JAR-файл, чтобы JCA мог аутентифицировать код во время выполнения.
Банки из бодрящего дерева подписаны. Вы переупаковали все классы в одну банку, но вы не сказали, что подписали ее, так что, думаю, вы этого не сделали. SSHJ
вероятно использует какой-то алгоритм шифрования и не может инициализировать bouncycastle
Опции:
Подпишите свой код сертификатом подписи кода
Разверните также bcprov-jdk15on-1.51.jar с вашим приложением