我在一个项目中使用 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>