【问题标题】:How to implement bouncycastle into one-jar?如何将 bouncycastle 实现到一个罐子中?
【发布时间】:2017-01-17 07:02:33
【问题描述】:

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

【问题讨论】:

    标签: java jar bouncycastle sshj


    【解决方案1】:

    签名jar需要implement a cryptographic provider

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

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

    选项:

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

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

    【讨论】:

    • 好的,所以主要问题是我在“一个震动” BC?为了能够做到这一点,我必须对生成的单罐包进行签名,对吗?有没有办法在不购买 CodeSigningCert 的情况下对此进行测试?不知何故自签名?
    • 是的,问题是未签名的“one-jar”。在我提供的链接中,您可以看到获取代码签名证书的过程。 Oracle 颁发测试证书(请参阅oracle.com/technetwork/java/javase/tech/…)。可能带有合适的key-usage 的自签名证书也可以使用。必须将公共部分导入 JVM 的信任库,并且不适用于 applet 或 JavaWebStart
    • 我记得我有来自另一个项目的 CodeSigningCertificate,但至少现在没有运气。我将构建一个罐子的 Ant 脚本添加到原始帖子中,我做错了什么?根据这篇stackoverflow.com/questions/19029575/… 的帖子,我将再次与我在 CSC 签署 BC。
    • 查看bouncycastle.org/wiki/display/JA1/… 如果您尝试构建与 Sun JCE 一起使用的提供程序,您需要有一个 Sun 签名证书来签署提供程序 jar 文件。 i> 可能您的图书馆使用 Sun JCE,所以恐怕您的 CodeSigningCertificate 将无法正常工作,需要向 Oracle 请求由 JCE 代码签名证书颁发机构 颁发的代码签名证书,如此处所述oracle.com/technetwork/java/javase/tech/…
    【解决方案2】:

    回答我自己的猜测:

    两种解决方案:

    1. 将库添加到 Java 的 lib/ext
      • 这确实不是我的解决方案,但可能对其他人有用。
    2. 使用 JDotSoft JarClassLoader
      • 使用简单,似乎支持添加 JCE 提供程序,例如 Bouncycastle。
      • 通过 Ant 构建将 BC-jar 添加到主 JAR 中:&lt;zipfileset dir="/build/libsToInclude/" includes="*.jar" prefix="lib/"/&gt;,其余的由类加载器完成。

    【讨论】:

    • JDotSoft JarClassLoader 也为我解决了这个问题,而我通常最喜欢这种情况的One-Jar 在 BouncyCastle JAR 被签名时遇到了问题,但我自己的 JAR 没有被签名。后续问题:有谁知道 JarClassLoader 类是否可作为 Maven Central 的依赖项使用?我没有在那里找到它,但也许我没有足够聪明地搜索。否则我正在考虑自己上传。将源代码复制到我的项目中有点难看。
    • 我也无法从 maven 存储库中找到它。也许你可以把它上传到 Maven 或者如果他们想自己做的话首先联系创建者 - 从网站上找到的电子邮件。
    • 我已经在几个小时前联系了创作者,正在等待回复。我只是想知道你是否知道更多。谢谢。
    • JDotSoft 不想在 Maven Central 上发布它,所以我做了。这是我的repo with artifact usage instructions,这是Maven artifact
    猜你喜欢
    • 1970-01-01
    • 2019-03-03
    • 2018-02-20
    • 1970-01-01
    • 2012-12-28
    • 2013-06-19
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多