BouncyCastle问题:一个tomcat中有多个webapps

时间:2017-06-16 09:40:55

标签: java tomcat java-ee bouncycastle

我们遇到了BouncyCastle安全提供程序的问题。我们在两个不同的Web应用程序中使用它,但它们由一个单独的tomcat部署。 我们在java.security.Security-Class中的第1位注册了BC-provider。

两个webapps都找到了正确的SecurityProvider,但是第一个注册BC的webapp最初似乎拥有所有权'它的。

第二个webapp尝试加载密钥库,如下面的代码所示:

if (Security.getSecurityProvider("BC") == null){
   keyStore = java.security.KeyStore.getInstance("PKCS12");
}else{
   keyStore = java.security.KeyStore.getInstance("PKCS12", Security.getSecurityProvider("BC"));
}   
keyStore.load(in, this.pin);

然后在keyStore.load(in, this.pin);发生以下异常:

  

java.io.IOException:构造MAC时出错:java.security.InvalidAlgorithmParameterException:不恰当的参数类型:javax.crypto.spec.PBEParameterSpec       在org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.engineLoad(PKCS12KeyStoreSpi.java:839)       在java.security.KeyStore.load(KeyStore.java:1445)

我们有这个问题,因为我们使用java8 / tomcat8 - java7 / tomcat7工作正常。 所以我们的假设是,这是由tomcat 8中类加载器机制的变化引起的。 在分离的tomcats中部署webapp不是我们的选择......

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我通过使用解决了这个问题

Provider provider = new BouncyCastleProvider();

代替

Provider provider = Security.getSecurityProvider("BC");

如果需要,您可以将实例化移动到静态字段以仅执行一次。考虑到这个问题花费了我多少时间,尝试使用正确的类加载器加载 BC 并且每次新安装都必须再次处理它,这非常简单。