bouncycastle + JBoss AS7:JCE无法验证提供商BC

mrz*_*asa 24 java security jboss bouncycastle jce

我在我的应用程序中使用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)
Run Code Online (Sandbox Code Playgroud)

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

    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());
Run Code Online (Sandbox Code Playgroud)

和maven依赖:

<dependency>
    <groupId>bouncycastle</groupId>
    <artifactId>bcmail-jdk16</artifactId>
    <version>140</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

你知道我怎么能部署它?

小智 45

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

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>
Run Code Online (Sandbox Code Playgroud)

设置模块后,需要将其部署到部署中.有两种方法:

1.全球通过standalone.xml

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

<subsystem xmlns="urn:jboss:domain:ee:1.0"/>
Run Code Online (Sandbox Code Playgroud)

<subsystem xmlns="urn:jboss:domain:ee:1.0">
    <global-modules>
        <module name="org.bouncycastle" slot="main"/>
    </global-modules>
</subsystem>
Run Code Online (Sandbox Code Playgroud)

jar库现在可以在所有应用程序中使用(这将"模拟"添加到类路径,如jboss 4,5,6等)

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

将模块依赖项条目添加到耳朵的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>
Run Code Online (Sandbox Code Playgroud)


Ger*_*cso 14

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

$JBOSS_HOME/server/default/lib/
Run Code Online (Sandbox Code Playgroud)

代替

yourapp/WEB-INF/lib
Run Code Online (Sandbox Code Playgroud)


Krz*_*zyk 13

但是,如果您将服务器从JBoss更改为其他服务器(例如Glassfish)您遇到了同样的问题.
对我来说更好的解决方案是jdk的变化.
您768,16分两步在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
Run Code Online (Sandbox Code Playgroud)

添加您的BC提供商

security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
Run Code Online (Sandbox Code Playgroud)

更改其他提供者的数量.整个提供商块应类似于:

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
Run Code Online (Sandbox Code Playgroud)

现在你必须重新启动java服务器.

  • 对不起,您不需要更改提供商.只需在SunPCSC提供商下添加下一个提供商,例如:`security.provider.10 = org.bouncycastle.jce.provider.BouncyCastleProvider` BC提供商不必是第二个.可能是最后一个. (4认同)