Java bouncycastle+;JBoss AS7:JCE无法验证提供程序BC

Java bouncycastle+;JBoss AS7:JCE无法验证提供程序BC,java,security,jboss,bouncycastle,jce,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.Exceptio

我在应用程序中使用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>

弹跳船舱
bcmail-jdk16
140

您知道如何部署它吗?

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

而不是


对于JBossAS7,bouncy castle需要作为服务器模块部署。这取代了早期版本的
server/default/lib
机制(如Gergely Bacso的回答所述)

JBossAS7使用jdk1.6+。在jdk1.6中使用jbossas7时,我们需要确保使用的是bcprov-jdk16

创建一个Jboss模块(一个$Jboss_HOME/modules/org/bouncycastle/main文件夹)。 将您希望在其中全局可用的bouncy castle罐子,以及如下所示的
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>

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

security.provider.1=sun.security.provider.Sun
添加您的BC提供商

security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
更改rest提供程序的数量。整个提供商组应类似于:

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服务器。

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

addProvider(新org.bouncycastle.jce.provider.BouncyCastleProvider())

资料来源:
对于那些不想更改服务器级别配置的用户

<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>  


使用物理代码源添加bouncy castle罐子对我来说很有效

这背后的原因是什么?如果它是独立运行的,并且在JBoss中运行时需要是一个模块,为什么它可以工作?模块没有被验证,但是WEB-INF/lib中的jar被验证了吗?说真的,你救了我:)我在RSA JSAFE provider中遇到了同样的错误,但现在通过这个解决方法可以消除它。感谢lotIn wildfly-9.0.2.Final,BouncyCastle的模块文件夹已存在于
/modules/system/layers/base/org/BouncyCastle/main/
中,因此您只需将其用于部署(全局或单个应用程序)。另请注意,在standalone.xml中,子系统
“urn:jboss:domain:ee”
已经存在,因此您只需将标记
添加到其内容中即可。@Pino您能否为初学者提供更详细的示例。@Awanish我的评论是对主要答案的一点更新。有关您必须对Wildfly的xml所做更改的描述,请参阅答案。对不起,您不需要更改提供程序。只需在SunPCSC provider下添加下一个提供程序,例如:
security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
BC provider不必是第二个。可能是最后一个。@KrzysztofSzewczyk但赏金城堡提供者不需要这里的最高提供者,即1。因为这里的优先级是从1到10。为什么会这样?我在JDK1.8中使用jboss-eap-6.4,我没有服务器目录这是我所需要的全部,我很高兴这是公认的答案+1.
<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>
security.provider.1=sun.security.provider.Sun
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
<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>