1

我在一个项目中使用 SSHJ 库。SSHJ 库使用了 bouncycastle 加密。

在 Eclipse 中一切都很好,但是在我使用 one-jar 将所有内容打包到单个 jar 包中之后,我遇到了 bouncycastle lib 的问题。bcprov-jdk15on-1.51.jar 包含在 /lib 中的 JAR 包中,所有其他库以及例如。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(new BouncyCastleProvider());” 在代码中

这就是所有“按预期”工作的方式:

  • 通过将“bcprov-jdk15on-1.51.jar”放入 JAVA_HOME\lib\ext\
    • 不幸的是,这对我来说是最后的选择。在 Java 版本更新的情况下维护库我会非常头疼。

那么,显然 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>
4

2 回答 2

1

实现加密提供程序,需要对 jar 进行签名

如果您的提供者通过Cipher KeyAgreementKeyGeneratorMacSecretKeyFactory类提供加密算法,您将需要签署您的 JAR 文件,以便 JCA 可以在运行时验证代码。

Bouncycastle 罐子已签名。您已将所有类重新打包到一个 jar 中,但您没有说您已签名,所以我猜您没有这样做。 SSHJ可能正在使用某种加密算法,无法初始化 bouncycastle

选项:

  • 使用代码签名证书签署您的代码

  • 还使用您的应用程序部署 bcprov-jdk15on-1.51.jar

于 2017-01-17T07:46:16.337 回答
1

回答我自己的猜测:

两种解决方案:

  1. 将库添加到 Java 的 lib/ext
    • 这对我来说确实不是一个解决方案,但可能对其他人有用。
  2. 使用 JDotSoft JarClassLoader
    • 使用简单,似乎支持添加 JCE 提供程序,例如 Bouncycastle。
    • 通过 Ant build: 将 BC-jar 添加到主 JAR 中:<zipfileset dir="/build/libsToInclude/" includes="*.jar" prefix="lib/"/>类加载器完成其余工作。
于 2017-03-20T08:04:19.240 回答