【问题标题】:Exception in thread "Main Thread" java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b线程“主线程”中的异常 java.lang.NoClassDefFoundError: javax/crypto/SunJCE_b
【发布时间】:2016-01-14 15:17:00
【问题描述】:

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

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

我配置了我的本地机器(windows)来查询这个网络服务。

从证书的角度来看,我设置了 2 个密钥库:一个包含 2 个条目的客户端密钥库:一个用于我的私钥和 一个用于我的证书,由 CA 签名。另一个 keystore , truststore ,为我的应用服务器(那个来宾 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上也可以复制,不是吗?

【问题讨论】:

  • 大家好,我尝试获取自签名证书并将其加载到我的信任存储中 - 为此我使用了 InstallCert 托管 ws 的 Web 服务器的管理员告诉我应该禁用验证自签名证书并将其视为受信任。我该如何禁用验证?在我的代码中,我可以访问以下对象:oracle.adf.share.ADFContext 和 oracle.adf.share.security.providers.jps.JpsSecurityContext;谢谢,奥雷尔

标签: java web-services ssl


【解决方案1】:

正如您所说的 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

【讨论】:

  • jce.jar 默认应该添加到类路径中 - 它在 jre 中。无论如何,我尝试了这个版本,我添加了 -cp .... 没有结果
  • @aurel:这个 jar 甚至不在我的系统(linux)上。你可以通过jar xf filename显示一个jar的内容你试过了吗?
  • 是的,我试过了,关于java抱怨的类在jce.jar中
【解决方案2】:

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

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

【讨论】:

  • 您的默认信任库是同一文件夹中的“cacerts”文件。只需将其复制并粘贴到 linux 上的 JVM 上即可。
  • 谢谢,但我正在使用 java 6 ,你想说 jce for java 6 ,不是吗?我这样做了 - 使用 java 6 的 jars,没有积极的结果
  • 操作,真的。您应该从 oracle 下载 jce java 6:oracle.com/technetwork/es/java/javase/downloads/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2014-11-06
  • 2012-11-18
相关资源
最近更新 更多