Как реализовать надувной замок в одну банку?

Я использую 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 ответа

Решение

Отвечая на мой вопрос:

Два решения:

  1. Добавить библиотеку в Java lib/ext
    • это действительно не было решением для меня, но могло бы работать для кого-то еще.
  2. Используйте JDotSoft JarClassLoader
    • Простой в использовании и обеспечивает поддержку добавления JCE-провайдеров, таких как Bouncycastle.
    • добавили BC-jar в основной JAR с помощью Ant build: <zipfileset dir="/build/libsToInclude/" includes="*.jar" prefix="lib/"/> и загрузчик сделал все остальное.

Для реализации криптографического провайдера необходим, чтобы баночка была подписана

Если ваш поставщик предоставляет алгоритмы шифрования через CipherKeyAgreement, KeyGenerator, Mac, или же SecretKeyFactory классы, вам нужно будет подписать свой JAR-файл, чтобы JCA мог аутентифицировать код во время выполнения.

Банки из бодрящего дерева подписаны. Вы переупаковали все классы в одну банку, но вы не сказали, что подписали ее, так что, думаю, вы этого не сделали. SSHJ вероятно использует какой-то алгоритм шифрования и не может инициализировать bouncycastle

Опции:

  • Подпишите свой код сертификатом подписи кода

  • Разверните также bcprov-jdk15on-1.51.jar с вашим приложением

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