【问题标题】:BouncyCastle 1.51 loading in war on Wildfly 8.0在 Wildfly 8.0 的战争中加载 BouncyCastle 1.51
【发布时间】:2015-06-24 08:51:17
【问题描述】:

背景

我正在尝试使用充气城堡库来解密我的战争中的私钥。现在我首先在一个独立的应用程序中测试了代码,它运行良好。现在,当我在 Wildfly8.0 中将其作为 web 应用程序进行测试时,我遇到了 Bouncy castle 的一些问题。

使用的 Wildfly 8.0 安装了充气城堡提供程序模块。 v1.46使用的BC版本。

我开发的代码使用v1.51。 我已按照此处提到的步骤操作:

已经尝试过

  • 安装 JCE 策略文件。
  • 添加到提供者列表。

问题

我得到的错误是:

unable to read encrypted data: JCE cannot authenticate the provider BC 

以及触发上述错误的代码,如下:

PKCS8EncryptedPrivateKeyInfo kp = (PKCS8EncryptedPrivateKeyInfo) keyPair;  
InputDecryptorProvider pkcs8dec = new JceOpenSSLPKCS8DecryptorProviderBuilder()  
      .setProvider(new BouncyCastleProvider())  
      .build("somepass".toCharArray());  
PrivateKeyInfo pko = kp.decryptPrivateKeyInfo(pkcs8dec);<-- ##Error here  

还要添加详细信息,在我的 pom.xml 中,我添加了带有编译范围的 jar,因此这些库被复制到战争中并安装在 WEB-INF/lib 中。

有解决上述问题的技巧吗?

【问题讨论】:

  • 您提到的“JBoss AS7:...”问题是“创建一个 Jboss 模块(一个文件夹 [...])。将您想要在全球范围内可用的充气城堡罐子放在它,连同一个 module.xml 文件 [...]",但在上面你说 BC jar 安装在 WEB-INF/lib 中。您是否可能误解了那里的说明?
  • 现有的 JBoss 模块使用 BC v1.46。我想在我的 webapp 中使用 BC v1.51。我无法升级 JBoss 模块以使用 BC v1.51,因为还有其他 webapps 依赖于 v1.46。希望这能说明问题。
  • 你不能为 1.51 创建第二个模块吗?
  • 我只是想让它尽可能地隔离,让它保持在战争级别似乎是最好的解决方案。
  • JCE api 具有对注册提供者地图的静态引用。 JCE 类来自父类加载器。如果来自不同类加载器的 2 个实现尝试将它们自己注册为相同的名称,则相互覆盖。因此,其中一个用户代码将收到错误的代码(可能来自它无权访问的类加载器)

标签: java jboss war bouncycastle wildfly-8


【解决方案1】:

我。结合 Peter (@comment) 和 https://developer.jboss.org/thread/175395 的想法,使用自定义名称创建“您自己的 bc 版本”:

  1. 按以下方式创建一个“my.bouncycastle”模块:

    • 在 $JBOSS_HOME/modules 下,创建目录“my/bouncycastle/main”。目录“我的”可能在那里。 ;)

    • 将 bcprov-[your-version].jar 复制到 my/bouncycastle/main

    • my/bouncycastle/main 中创建文件'bcprov-[your-version].jar.index',这基本上是jar -tf 命令的输出没有“.class”行。 (管道和编辑...)

      我在顶部放了一个空行,因为这些 .index 文件似乎总是有一个。我已将此文件附加为“bcprov-jdk16-1.46.jar.index”。

    • my/bouncycastle/main 中创建一个名为“module.xml”的文件,该文件将指向 jar 文件并引用模块“javax.api”作为依赖项。

      我已将此文件附加为“module.xml”。 模块完成。

  1. 由于我在 EAR 文件中进行部署,因此我必须在 EAR 的 META-INF/jboss-deployment-structure.xml 文件的部分下方添加一个模块依赖项条目,如下所示:

(该语句也适用于 WAR 文件,当部署在顶层时,使用 自定义名称 作为模块引用)

    <deployment><dependencies><module name="my.bouncycastle" slot="main" export="true"/>  
  1. 确保耳朵的 /lib 目录不包含 bcprov-[your-version].jar。 (实际上是 II.)

注意事项: jboss-dependency-structure.xml 文件中的 'slot="main" 和 'export="true" 参数非常重要...

二。将您的 Maven 依赖项调整为:

<scope>provided</scope>

注意:不要将 maven 依赖项(即组工件)更改为“my.bouncycastle”,只更改范围,这将确保大多数 IDE 的编译时行为都很好并且会阻止您的 (maven-)war/jar/ear-plugin 将其打包到库中! (无论如何,这将是像这样的依赖项的正确范围。)

【讨论】:

    猜你喜欢
    • 2015-11-23
    • 2015-11-28
    • 2017-04-13
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多