Java BouncyCastle 1.51 Wildfly 8.0在战争中加载
背景 在我的战争中,我试图使用bouncy castle库解密私钥。现在,我首先在一个独立的应用程序中测试了代码,它运行良好。现在,当我在Wildfly8.0中将其作为一个网络应用程序进行测试时,我遇到了一些与Bouncy castle有关的问题 使用的Wildfly 8.0 am安装了bouncy castle提供程序模块。v1.46中使用的BC版本 我开发的代码使用v1.51。 我遵循了这里提到的步骤:Java BouncyCastle 1.51 Wildfly 8.0在战争中加载,java,jboss,war,bouncycastle,wildfly-8,Java,Jboss,War,Bouncycastle,Wildfly 8,背景 在我的战争中,我试图使用bouncy castle库解密私钥。现在,我首先在一个独立的应用程序中测试了代码,它运行良好。现在,当我在Wildfly8.0中将其作为一个网络应用程序进行测试时,我遇到了一些与Bouncy castle有关的问题 使用的Wildfly 8.0 am安装了bouncy castle提供程序模块。v1.46中使用的BC版本 我开发的代码使用v1.51。 我遵循了这里提到的步骤: -具体遵循中针对特定部署提供的说明(首选) 已尝试过 安装JCE策略文件 添加到
- -具体遵循中针对特定部署提供的说明(首选)
- 安装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
PKCS8EncryptedPrivateKeyInfo kp=(PKCS8EncryptedPrivateKeyInfo)密钥对;
InputDecryptorProvider pkcs8dec=new JceOpenSSLPKCS8DecryptorProviderBuilder()
.setProvider(新的BouncyCastleProvider())
.build(“somepass.tocharray());
PrivateKeyInfo pko=kp.decryptPrivateKeyInfo(pkcs8dec) I.结合Peter(@comment)的想法,创建具有自定义名称的“您自己的bc版本”:
按以下方式创建“my.bouncycastle”模块:
- 在$JBOSS_HOME/modules下,创建目录“my/bouncycastle/main”。目录“my”可能不在那里
- 将bcprov-[您的版本].jar复制到我的/bouncycastle/main中
- 在my/bouncycastle/main中创建文件“bcprov-[your version].jar.index”,它基本上是
jar-tf
命令的输出,没有“.class”行。(管道和编辑…)
我在顶部放了一个空行,因为这些.index文件似乎总是有一个。我已将此文件作为“bcprov-jdk16-1.46.jar.index”附上
- 创建一个名为“module.xml”的文件,也在my/bouncycastle/main中,它将指向jar文件并引用模块“javax.api”作为依赖项
我已将此文件附加为“module.xml”。
模块已完成
由于我是在EAR文件中部署的,所以我必须在我的EAR的META-INF/jboss-deployment-structure.xml文件的下面添加一个模块依赖项,如下所示:
(该语句也适用于WAR文件,在顶级部署时,使用自定义名称作为模块参考)
确保ear的/lib目录不包含bcprov-[您的版本].jar。(实际上是二)
注:
在jboss-dependency-structure.xml文件中,'slot=“main”和'export=“true”参数非常重要
二,。将maven依赖项调整为:
已提供
注意:不要将maven依赖性(ies组工件)更改为“my.bouncycastle”,只更改范围,这将确保大多数IDE都具有良好的编译时行为,并防止(maven-)war/jar/ear插件将其打包到libs中!(哪一个是像这样的依赖项的正确范围。)您提到的“JBoss AS7:…”问题是“创建一个JBoss模块(一个文件夹[…])。将您希望在其中全局可用的bouncy castle jar与module.xml文件[…]),但上面您说BC jar安装在WEB-INF/lib中。有没有可能您误解了那里的说明?有一个使用BCV1.46的JBoss模块。我想在我的webapp中使用bcv1.51。我无法升级JBoss模块以使用BCV1.51,因为还有其他Web应用程序依赖于v1.46。希望这能说明问题。难道你不能为1.51创建第二个模块吗?我只是想让它尽可能地隔离,并将其保持在war级别似乎是最好的解决方案。JCE api对注册提供商的地图有静态引用。JCE类来自父类加载器。如果两个实现来自不同的类加载器,请尝试将它们自己注册到同一个名称上,并相互覆盖。因此,其中一个用户代码将接收到错误的代码(可能来自它没有访问权限的类加载器)
<deployment><dependencies><module name="my.bouncycastle" slot="main" export="true"/>
<scope>provided</scope>