26

我在我的应用程序中使用 BouncyCastle 进行加密。当我独立运行它时,一切正常。但是,如果我将它放在 webapp 中并部署在 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>

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

4

5 回答 5

47

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

JBoss AS7 使用 jdk1.6+。当使用带有 jdk1.6 的 JBoss AS7 时,我们需要确保我们使用的是 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. 全局通过standalone.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>
于 2012-05-01T14:18:44.607 回答
14

不要将 bouncy-castle jar 部署为您的 web 应用程序 (WEB-INF/lib) 的一部分。当然,您在编译时需要这个文件,但在 JBOSS 上它应该在这里:

$JBOSS_HOME/server/default/lib/

代替

yourapp/WEB-INF/lib
于 2012-03-02T15:05:37.420 回答
13

但是,如果您将服务器从 JBoss 更改为其他服务器(例如 Glassfish),您也会遇到同样的问题。
对我来说更好的解决方案是 jdk 的变化。
您应该分两步将 Bouncy Castle 添加到您的 java 平台上的安全提供程序:
1.将 BC 库(当前为 bcpkix-jdk15on-149.jar、bcprov-jdk15on-149.jar)复制到目录$JAVA_HOME/jre/lib/ext/
2.注册 BC 提供者:编辑文件$JAVA_HOME/jre/lib/security/java.security并在行下

security.provider.1=sun.security.provider.Sun

添加您的 BC 提供者

security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider

更改休息提供者的数量。整个提供程序块应类似于:

security.provider.1=sun.security.provider.Sun
security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.3=sun.security.rsa.SunRsaSign
security.provider.4=sun.security.ec.SunEC
security.provider.5=com.sun.net.ssl.internal.ssl.Provider
security.provider.6=com.sun.crypto.provider.SunJCE
security.provider.7=sun.security.jgss.SunProvider
security.provider.8=com.sun.security.sasl.Provider
security.provider.9=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.10=sun.security.smartcardio.SunPCSC

现在您必须重新启动 java 服务器。

于 2013-07-01T09:09:15.927 回答
0

当我放入其他线程时,也可以通过添加以下行以编程方式添加:

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

来源: jce 无法验证提供者 bc

于 2015-12-03T16:57:00.163 回答
0

对于那些不想更改服务器级别配置的人,

<jboss-deployment-structure>  
   <deployment>  
      <resources>  
         <resource-root path="WEB-INF/lib/bcprov-jdk16-1.46.jar" use-physical-code-source="true"/>  
      </resources>  
   </deployment>  
</jboss-deployment-structure>  

添加带有 use-physical-code-source 的充气城堡罐子对我有用

于 2018-07-12T13:51:09.470 回答