【问题标题】:KeystoreException Bouncy Castle not found on application server在应用程序服务器上找不到 KeystoreException Bouncy Castle
【发布时间】:2016-04-25 23:56:52
【问题描述】:

在我的 Glashfish 4.1 上的 Web 应用程序中发生了一个不确定的错误。当我打电话时

KeyStore.getInstance("BouncyCastle", "BC")

我得到以下堆栈跟踪:

警告:javax.ejb.EJBException 在 com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748) 在 com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698) 在 com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503) 在 com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4566) 在 com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2074) 在 com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2044) 在 com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220) 在 com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) 在 com.sun.proxy.$Proxy309.load(未知来源) 在 de.lkrnrw.careso.das.server.business.keymanagement.boundary.__EJB31_Generated__CaresoKeyManager__Intf____Bean__.load(未知来源) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.jboss.weld.util.reflection.Reflections.invokeAndUnwrap(Reflections.java:414) 在 org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:127) 在 org.jboss.weld.bean.proxy.EnterpriseTargetBeanInstance.invoke(EnterpriseTargetBeanInstance.java:56) 在 org.jboss.weld.bean.proxy.InjectionPointPropagatingEnterpriseTargetBeanInstance.invoke(InjectionPointPropagatingEnterpriseTargetBeanInstance.java:65) 在 org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100) 在 de.lkrnrw.careso.das.server.business.keymanagement.boundary.CaresoKeyManager$Proxy$_$$_Weld$EnterpriseProxy$.load(未知来源) 在 de.lkrnrw.careso.das.server.business.keymanagement.rest.KeyService.onUnlockKeyStore(KeyService.java:102) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:151) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:171) 在 org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152) 在 org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:387) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:331) 在 org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:103) 在 org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:271) 在 org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) 在 org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:315) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:297) 在 org.glassfish.jersey.internal.Errors.process(Errors.java:267) 在 org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297) 在 org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254) 在 org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1028) 在 org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:372) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344) 在 org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221) 在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 在 de.lkrnrw.careso.das.server.restconfig.config.Authenticator.doFilter(Authenticator.java:35) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 在 com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:415) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282) 在 com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 在 org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201) 在 org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175) 在 org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 在 org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) 在 org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 在 org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561) 在 org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565) 在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545) 在 java.lang.Thread.run(Thread.java:745) 引起:de.ekrnrw.commons.ee.keystore.control.exceptions.ManagedKeyStoreException:java.security.KeyStoreException:找不到BouncyCastle 在 de.ekrnrw.commons.ee.keystore.control.ManagedKeyStorePersistenceService.loadKeyStore(ManagedKeyStorePersistenceService.java:50) 在 de.ekrnrw.commons.ee.keystore.boundary.KeyManager.load(KeyManager.java:269) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081) 在 org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153) 在 com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786) 在 com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656) 在 com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 在 com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608) 在 org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46) 在 org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52) 在 sun.reflect.GeneratedMethodAccessor51.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) 在 com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 在 com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608) 在 com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163) 在 com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140) 在 sun.reflect.GeneratedMethodAccessor52.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883) 在 com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822) 在 com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369) 在 com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758) 在 com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746) 在 com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212) ... 72 更多 原因:java.security.KeyStoreException:找不到 BouncyCastle 在 java.security.KeyStore.getInstance(KeyStore.java:899) 在 de.ekrnrw.commons.ee.keystore.control.ManagedKeyStorePersistenceService.loadKeyStore(ManagedKeyStorePersistenceService.java:47) ... 102 更多 原因:java.security.NoSuchAlgorithmException:构造实现时出错(算法:BouncyCastle,提供者:BC,类:org.bouncycastle.jce.provider.JDKKeyStore$BouncyCastleStore) 在 java.security.Provider$Service.newInstance(Provider.java:1621) 在 sun.security.jca.GetInstance.getInstance(GetInstance.java:236) 在 sun.security.jca.GetInstance.getInstance(GetInstance.java:206) 在 java.security.Security.getImpl(Security.java:698) 在 java.security.KeyStore.getInstance(KeyStore.java:896) ... 103 更多 原因:java.lang.IllegalStateException:此 Web 容器尚未启动 在 org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1674) 在 org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1633) 在 java.security.Provider$Service.getImplClass(Provider.java:1636) 在 java.security.Provider$Service.newInstance(Provider.java:1592) ... 107 更多

可以通过从 glasfish 取消部署应用程序并重新启动来临时修复该错误。 我研究了一些明显的原因,比如在 Java 中添加安全提供程序并添加 Bouncy Castle 依赖项:

<dependency>
    <groupId>bouncycastle</groupId>
    <artifactId>bcprov-jdk16</artifactId>
    <version>140</version>
</dependency>

Bouncy Castle 依赖项有一些变体可供选择,但正如我所提到的,它有时确实有效。

我知道这是在黑暗中拍摄,但你知道这可能是什么原因吗?非常感谢任何帮助,如果我忘记了任何相关信息,请告诉我。

谢谢,亚尼克。

【问题讨论】:

    标签: glassfish bouncycastle keystore


    【解决方案1】:

    我猜这个问题是因为您打包了一个非常旧且过时的加密提供程序版本。 您不应使用 bcprov-jdk16 提供程序。

    人们不应该使用 jdk16 发行版。他们很 过时了。 jdk15on 发行版涵盖了从 1.5 开始的所有内容。

    尝试以下方法:

    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.54</version>
    </dependency>
    

    【讨论】:

    • 感谢您的建议。实际上,我确实在所有其他项目中都使用了该依赖项。但是,我再次测试它,有时仍然会出现错误。
    【解决方案2】:

    最终解决方法: 由于我们永远无法弄清楚为什么会发生这种不确定性错误,因此我们继续将充气城堡直接添加到 glassfish 服务器的 JVM 中。从那以后,该错误再也没有发生过。

    以下是如何将库添加到 JVM 的简要说明:

    将“bcprov-ext-jdk15on-1.54.jar”复制到 JDK 文件夹中。在 Linux 下,这可能位于“/opt/Oracle_Java”,在这种情况下运行

    sudo scp bcprov-ext-jdk15on-1.54.jar /opt/Oracle_Java/jdk1.8.0_76/jre/lib/ext
    

    在终端上。 之后注册新库。转到“/opt/Oracle_Java/jdk1.8.0_76/jre/lib/security”并将最后一行添加到“java.security”文件:

    security.provider.1=sun.security.provider.Sun
    security.provider.2=sun.security.rsa.SunRsaSign
    security.provider.3=sun.security.ec.SunEC
    security.provider.4=com.sun.net.ssl.internal.ssl.Provider
    security.provider.5=com.sun.crypto.provider.SunJCE
    security.provider.6=sun.security.jgss.SunProvider
    security.provider.7=com.sun.security.sasl.Provider
    security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
    security.provider.9=sun.security.smartcardio.SunPCSC
    security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider //line to be added
    

    根据已注册的库,您的 java.security 文件可能看起来不同。

    【讨论】:

      猜你喜欢
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2017-12-18
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多