弹跳城堡 + JBoss AS7:JCE 无法验证提供程序 BC

2022-09-01 16:32:21

我在我的应用程序中使用BouncyCastle进行加密。当我独立运行它时,一切正常。但是,如果我将其放在web应用程序中并部署在JBoss服务器上,则会出现以下错误:

javax.servlet.ServletException: error constructing MAC: java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
(...)
root cause
java.lang.Exception: error constructing MAC: java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
(...)
root cause
java.io.IOException: error constructing MAC: java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
    org.bouncycastle.jce.provider.JDKPKCS12KeyStore.engineLoad(Unknown Source)
    java.security.KeyStore.load(Unknown Source)

下面是导致此错误的代码的一部分:

    if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null)
    {
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    }

    // Read the Private Key
    KeyStore ks = KeyStore.getInstance("PKCS12", BouncyCastleProvider.PROVIDER_NAME);
    ks.load(new FileInputStream(certificatePath), privateKeyPassword.toCharArray());

和 maven 依赖性:

<dependency>
    <groupId>bouncycastle</groupId>
    <artifactId>bcmail-jdk16</artifactId>
    <version>140</version>
</dependency>

你知道我该如何部署它吗?


答案 1

对于 JBoss,AS7 的充气城堡需要部署为服务器模块。这取代了早期版本的机制(如Gergely Bacso的答案中所述)。server/default/lib

JBoss AS7 使用 jdk1.6+。当将 JBoss AS7 与 jdk1.6 一起使用时,我们需要确保使用的是 bcprov-jdk16。

创建一个 Jboss 模块(文件夹$JBOSS_HOME/modules/org/bouncycastle/main)。将您希望全局可用的充气城堡罐子以及如下所示的文件放在其中:module.xml

<module xmlns="urn:jboss:module:1.1" name="org.bouncycastle">
    <resources>
        <resource-root path="bcprov-jdk16-1.46.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api" slot="main" export="true"/>
    </dependencies>
</module>

设置模块后,需要使其可用于部署。有两种方法:

1. 通过独立方式在全球范围内.xml

在$JBOSS_HOME/standalone/configuration/standalone中.xml替换

<subsystem xmlns="urn:jboss:domain:ee:1.0"/>

<subsystem xmlns="urn:jboss:domain:ee:1.0">
    <global-modules>
        <module name="org.bouncycastle" slot="main"/>
    </global-modules>
</subsystem>

jar库现在将在所有应用程序中可用(这将“模拟”添加到类路径中,就像在jboss 4,5,6等中一样)

2. 对于特定部署(首选)

将模块依赖性条目添加到 ear 的文件中,在该部分下,例如:META-INF/jboss-deployment-structure.xml

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
    <deployment>
        <dependencies>
            <module name="org.bouncycastle" slot="main" export="true" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>

答案 2

不要将充气城堡罐部署为 web 应用的一部分 (WEB-INF/lib)。当然,在编译时需要此文件,但在 JBOSS 上,它应该在这里:

$JBOSS_HOME/server/default/lib/

而不是

yourapp/WEB-INF/lib