有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

重新部署应用程序时无法加载java Bouncycastle

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

编辑:

我在上面的链接中使用了这两种方法,因为当我只使用其中一种方法时,它就不起作用了 我添加到java中。在我的班级里,我注册了这个认证者:

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

共 (3) 个答案

  1. # 1 楼答案

    你可能有一个NoClassDefFoundError。这是JSSE实现中的一个已知问题

    以下是场景:

    • 您的容器在特定于应用程序的类加载器中加载bouncy castle类
    • 您创建的提供程序实例依赖于该类以及该类加载器
    • 然后,由于顶级JVM类加载器中的静态字段,提供者被注册到JREAPI中
    • 重新部署时,容器丢弃应用程序类加载器以创建新的类加载器
    • 由于已经知道该算法,第二个提供程序插入会以静默方式失败
    • 使用该算法时,提供程序实例根本不可用,因为类加载器已被丢弃
    • 然后,唯一的选择是重新启动容器以修复这种情况

    由于没有用于取消部署事件的标准侦听器,因此不可能同时触发JSSE提供程序的删除

    避免这种麻烦的推荐方法是在JVM类路径或容器类路径中使用bouncy castle类。您必须将其从应用程序中删除。现在,您需要使用静态初始值设定项的替代选项注册BC provider。WebLogic提供了ways to trigger code at server startup(我使用了服务器启动类),该代码将负责在整个服务器/JVM生命周期内注册JSSE提供程序

    另一种选择是在JREjava.security文件中添加以下行,在jre/lib/ext中使用bouncy castle jar,但我不喜欢这种方式,因为它在更新时可能会丢失:security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider

    因此,应用程序只是希望有实现,添加算法可用性测试以向操作员和用户报告任何问题可能是一个好主意

  2. # 2 楼答案

    这个问题可以通过以下代码和sun的使用轻松解决。安全jce包:

    ProviderList list = Providers.getFullProviderList();
    ProviderList.add(list, new BouncyCastleProvider());
    Providers.beginThreadProviderList(list);
    

    列表将被扩展以使用bouncy castle提供程序,新列表将作为本地线程注入。这可以在servletfilter或其他东西中使用。请求完成后,可能需要将列表重置为旧值

    Providers.endThreadProviderList(this.oldList);
    
  3. # 3 楼答案

    我使用此变通方法在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,以便在重新部署后再次使用它