【问题标题】:BouncyCastle problems: Multiple webapps in one tomcatBouncyCastle 问题:一个tomcat中的多个webapps
【发布时间】:2017-06-16 09:40:55
【问题描述】:

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

两个 webapp 都找到了正确的 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 中类加载器机制的变化引起的。 在单独的 tomcat 中部署 webapp 对我们来说不是一个选择...

感谢您的帮助。

【问题讨论】:

  • 是否可以选择将 BC 提供程序 jar 安装为扩展库(在 $JRE/lib/ext 中)?

标签: java tomcat jakarta-ee bouncycastle


【解决方案1】:

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

Provider provider = new BouncyCastleProvider();

而不是

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

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

【讨论】:

    猜你喜欢
    • 2010-09-20
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2021-02-04
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多