重新部署应用程序时无法加载弹跳城堡

2022-09-03 17:19:52

我按照这个说明添加弹力城堡:http://www.bouncycastle.org/wiki/display/JA1/Provider+Installation 但我仍然有一个问题。有时,当我重新部署应用程序时,找不到此提供程序,因此我的应用程序会引发异常。此问题每 100 个重新部署中仅发生一次(可能更少)。当我重新启动我的服务器 - weblogic,然后它再次开始工作。我将非常感谢任何建议,为什么发生这个问题

编辑:

我在上面的链接中使用了这两种方法,因为当我只使用其中一个时,它就不起作用了,我将其添加到java.security这个provder,然后在我的类中注册了这个provder:

static {
    Security.addProvider(new BouncyCastleProvider());
}

答案 1

您可能得到了一个.这是 JSSE 实现的一个已知问题。NoClassDefFoundError

下面是一个场景:

  • 容器在特定于应用程序的 ClassLoader 中加载弹性城堡类
  • 您创建的提供程序实例取决于该类,依此类推
  • 然后,由于顶级JVM ClassLoader中的静态字段,提供程序被注册到JRE API中
  • 重新部署时,容器会丢弃应用程序 ClassLoader 以创建新的应用程序 ClassLoader
  • 由于算法已经知道,第二个提供程序插入以静默方式失败
  • 使用该算法时,提供程序实例根本无法使用,因为 ClassLoader 已被丢弃
  • 然后,唯一的选择是重新启动容器以修复情况。

由于取消部署事件没有标准侦听器,因此无法一次触发 JSSE 提供程序删除。

避免这种麻烦的推荐方法是在 JVM ClassPath 或容器 ClassPath 中使用充气城堡类。您必须将其从应用程序中删除。现在,您需要使用静态初始值设定项的备用选项注册 BC 提供程序。WebLogic提供了在服务器启动时触发代码的方法(我使用过服务器启动类),此代码将负责在整个服务器/JVM生命周期内注册JSSE提供程序。

另一种选择是在JRE文件中添加以下行,其中包含充气城堡罐,但我不喜欢这样,因为它在更新时可能会丢失:java.securityjre/lib/extsecurity.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider

因此,应用程序只是期望实现存在,添加算法可用性测试以向操作员和用户报告任何麻烦可能是一个好主意。


答案 2

我使用这个解决方法在Tomcat中重新部署应用程序:

public class GenSignCastle {
    BouncyCastleProvider        bcProvider = null;

public GenSignCastle() {
    if ( bcProvider == null ) {
        bcProvider = new BouncyCastleProvider();
        Provider[] providers = Security.getProviders();

        String name = bcProvider.getName();
        Security.removeProvider( name ); // remove old instance

        Security.addProvider( bcProvider );
    }
}
.
.
.
}

有趣的是,我必须首先删除BouncyCastleProvider,以便在重新部署后再次使用它。


推荐