线程中的异常"主线程" java.lang.NoClassDefFoundError:javax / crypto / SunJCE_b

时间:2016-01-14 15:17:00

标签: java web-services ssl

我开发了一个访问ssl Web服务的Java应用程序。

我使用带有基本身份验证的java 6 jax-ws来访问此ws。

我配置了本地计算机(Windows)来查询此Web服务。

从证书的角度来看,我设置了2个密钥库:一个包含2个条目的客户端密钥库:一个用于我的私钥和                                                   一个用于我的证书,由CA签名。另一个密钥库,信任库,为我的应用服务器(该客户为ws)保留一个条目。

这是一张自签名证书,当然,我的客户对此抱怨。我发现here是此错误的解决方法,我在我的信任库中导入了此证书。现在我可以从本地机器查询ws。

在PreProduction机器(RHEL 5)上,我收到相同的错误消息"

  

PKIX路径构建失败:   sun.security.provider.certpath.SunCertPathBuilderException:无法   找到所请求目标的有效证书路径"

我试着做同样的事情。但是当我跑步时:

java InstallCert my_ip:ssl_port changeit 

我得到以下输出

Loading KeyStore cacerts...
Opening connection to my_ip:ssl_port...
Starting SSL handshake...

Exception in thread "Main Thread" java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b
        at javax.crypto.KeyGenerator.a(DashoA13*..)
        at javax.crypto.KeyGenerator.<init>(DashoA13*..)
        at javax.crypto.KeyGenerator.getInstance(DashoA13*..)
        at com.sun.net.ssl.internal.ssl.JsseJce.getKeyGenerator(JsseJce.java:223)
        at com.sun.net.ssl.internal.ssl.RSAClientKeyExchange.<init>(RSAClientKeyExchange.java:91)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:744)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:238)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:958)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1203)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1230)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1214)
        at InstallCert.main(InstallCert.java:58)

类javax.crypto.sunJCE_b jre / lib中有一个jce.jar。你觉得怎么样?

另一个问题:我在Windows中获得的信任库(包含导入的服务器证书的信任库)不可移植?

我在windows上使用的那个,我可以在linux上复制它,不是吗?

2 个答案:

答案 0 :(得分:0)

正如你所说jar存在,你可能需要将它添加到你的类路径,如下所示:

java -cp /path/to/jce.jar:. InstallCert my_ip:ssl_port changeit

要仅列出类路径,请参阅https://stackoverflow.com/a/17541055/1587329

至于

  

另一个问题:我在Windows中获得的信任库(包含导入的服务器证书的信任库)不可移植?

     

我在windows上使用的那个,我可以在linux上复制它,不是吗?

建议重新创建它:Migrating a certificate keystore to another JVM

答案 1 :(得分:0)

我在使用installCert应用程序时遇到了类似的问题。尝试修改Java Crypto Policys。从oracle,JCE for Java 7下载文件。

您只需下载并替换JAVA_HOME / jre / lib / security中的现有文件即可。 这应该有用。