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

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

  bouncycastle bcmail-jdk16 140  

你知道我怎么能部署它?

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

 $JBOSS_HOME/server/default/lib/ 

代替

 yourapp/WEB-INF/lib 

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

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

创建一个Jboss模块(文件夹$ JBOSS_HOME / modules / org / bouncycastle / main)。 把你想要全局可用的充气城堡jar子和一个看起来像这样的module.xml文件module.xml一起:

         

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

1.全球通过standalone.xml

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

  

      

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

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

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

        

但是,如果您将服务器从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服务器。

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

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

来源: jce无法对提供商bc进行身份validation

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

        

添加充气城堡jar与使用物理代码源为我工作