如何在一个罐子里实现充气城堡



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

在eclipse中,一切都很好,但在我使用一个jar将所有内容打包到一个jar包中之后,我面临着bouncycastle lib的问题。bcprov-jdk15on-1.51.jar包含在/lib中的jar包中,其中包括所有其他库,例如sshj.jar。

在日志上我有这些:

安全提供程序类找不到"org.bouncycastle.jce.provider.BouncyCastleProvider">

和这个

警告:禁用高强度密码:密码强度明显受JCE政策限制

通过该功能,SFTP连接将生成:

net.schmizz.shj.transport.TransportException:无法访问解决方案:[die-hellman-group1-sha1,diffie-hellman-group-exchange-sha1]和[die-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>

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

如果您的提供者通过CipherKeyAgreementKeyGeneratorMacSecretKeyFactory类提供加密算法,则需要对JAR文件进行签名,以便JCA可以在运行时对代码进行身份验证。

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

选项:

  • 使用代码签名证书对您的代码进行签名

  • 还部署bcprov-jdk15on-1.51.jar与您的应用

回答我自己的猜测:

两种解决方案:

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

最新更新