【问题标题】:SunTlsRsaPremasterSecret KeyGenerator not availableSunTlsRsaPremasterSecret KeyGenerator 不可用
【发布时间】:2011-02-21 18:51:00
【问题描述】:

当我的应用程序尝试从 JAVA 加载 RSA 算法提供程序类时遇到错误。异常堆栈如下:

javax.jms.JMSException: RSA premaster secret error
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:49)
at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1255)
at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1350)
at org.apache.activemq.ActiveMQConnection.setClientID(ActiveMQConnection.java:388)
at com.trendmicro.tmsm.TMSMAgent.open(TMSMAgent.java:63)

Caused by: javax.net.ssl.SSLKeyException: RSA premaster secret error
at com.sun.net.ssl.internal.ssl.RSAClientKeyExchange.<init>(RSAClientKeyExchange.java:97)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:634)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:226)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:623)
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
at org.apache.activemq.transport.tcp.TcpBufferedOutputStream.flush(TcpBufferedOutputStream.java:115)
at java.io.DataOutputStream.flush(DataOutputStream.java:106)
at org.apache.activemq.transport.tcp.TcpTransport.oneway(TcpTransport.java:167)
at org.apache.activemq.transport.InactivityMonitor.oneway(InactivityMonitor.java:237)
at org.apache.activemq.transport.WireFormatNegotiator.sendWireFormat(WireFormatNegotiator.java:168)
at org.apache.activemq.transport.WireFormatNegotiator.sendWireFormat(WireFormatNegotiator.java:84)
at org.apache.activemq.transport.WireFormatNegotiator.start(WireFormatNegotiator.java:74)
at org.apache.activemq.transport.failover.FailoverTransport.doReconnect(FailoverTransport.java:715)
at org.apache.activemq.transport.failover.FailoverTransport$2.iterate(FailoverTransport.java:115)
at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:122)
at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:43)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:637)

Caused by: java.security.NoSuchAlgorithmException: SunTlsRsaPremasterSecret KeyGenerator not available
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:89)
... 22 more

我用谷歌搜索了错误消息,大多数帖子都说这是因为 JVM 找不到 sunjce_provider.jar。但是,我可以在 /Library/Java/Home/lib/ext 文件夹中找到该文件。

平台为 Mac OS X 10.6,Java 版本为 1.6.0_17。

我的问题是:

  1. 为什么 JVM 不搜索 /Library/Java/Home/lib/ext 的 jar 文件?
  2. 我们可以通过修改任何配置文件来更改 CLASSPATH 或 java.ext.dirs 属性吗?
  3. 有解决此问题的建议吗?

提前致谢。

【问题讨论】:

    标签: java macos


    【解决方案1】:

    就我而言,我遇到了同样的问题,在阅读了上述解决方案后,我更改了 JRE 定义并恢复默认值。现在工作正常。

    【讨论】:

      【解决方案2】:

      可能的解决方案:检查 jdk 路径是否设置为 C:\Program Files\Java\jdk1.8.0_171 但不包括 bin

      【讨论】:

        【解决方案3】:

        我知道,我来晚了。但是对我来说,当我将 Preference -> Java -> Installed JREs -> Execution Environments as JavaSE-1.8 更改为 jdk1.8 路径时,这个错误就突然出现了。不过应该是jre1.8路径。

        我不知道为什么现在会这样。但它解决了问题。

        【讨论】:

          【解决方案4】:

          我也遇到了这个问题,发现问题出在我的 Eclipse 配置中。

          Window > Preferences > Java > Installed JREs > jdk8_64bit > Edit...
          

          我的sunjce_provider.jar 的路径指向jdk8_64bit\lib\ext\sunjce.provider.jar。它应该指向 jdk8_64bit\jre\lib\ext\sunjce.provider.jar 中的 JRE 等价物。

          【讨论】:

            【解决方案5】:

            在尝试在 Eclipse Luna 中使用 JavaMail 时不得不花费将近一天的时间。 尝试了各种论坛中建议的所有方法,但没有成功。

            挖掘完整流程,发现Class is on BootClassPath

            从 KeyAgreement.getInstance()->JceSecurity.canUseProvider()->JceSecurity.getVerificationResult()->JarVerifier.verify()

            无效验证() 抛出 JarException、IOException { 如果(jarURL == null){ throw new JarException("Class is on the bootclasspath"); }.......

            我从 \ext\ 文件夹中删除了 sunjce_provider jar,现在可以发送邮件了。 这可能不正确,但至少是一个快速的解决方法。

            请参考Eclipse bug

            【讨论】:

              【解决方案6】:

              从 Eclipse 启动 tomcat 服务器时发生在我身上。我通过更改 Windows -> Preferences -> Java -> Installed JREs -> Edit 中的配置解决了这个问题。我必须使用以下文件夹中的相应 jar 更新所有 JRE 系统库:

              • %JAVA_HOME%/jre/lib/ext
              • %JAVA_HOME%/jre/lib/

              似乎在上次更新后我更改了 JRE_Home 但忘记了那些库。

              【讨论】:

                【解决方案7】:

                有类似的问题。将类路径添加到 ext 目录为我修复了它。此修复程序在带有 java 1.6 的 Windows 7 上对我有用

                java -Djava.ext.dirs=lib -classpath "%java_home%\lib\ext\*" myapp.jar 
                

                【讨论】:

                • 谢谢哥们;你拯救了我的世界!经过几个小时的挫折,这也解决了我的问题
                • 我也面临同样的问题。你能看看我的帖子吗?stackoverflow.com/questions/19432051/…
                【解决方案8】:

                在 Mac 上升级到新的 Java 版本后,我遇到了同样的问题。 我的(maven)项目从命令行运行正常,但在 Eclipse 中出现“SunTlsRsaPremasterSecret”错误。

                解决方案是在 Eclipse 配置中删除已安装的 JRE,然后再次添加它们(使用“搜索...”按钮)。

                【讨论】:

                • 这也对我有用。我不得不从 Preferences -> Java -> Installed JREs 中删除所有 JRE 条目。它不允许我删除最后一个,所以我必须用不同的名称重新添加一个,然后删除原来的。然后将它们全部重新添加。
                • 我将指向 Eclipse 指向一个指向 JDK 的符号链接文件夹。删除真正的文件夹并将其读取到 Eclipse 为我解决了这个问题。
                • 我在 Windows 7 JDK 1.8.0_05 上的 Eclipse Luna 中遇到了同样的问题;此修复有效,但我必须在之后重新启动 Eclipse 才能生效。
                • 谢谢伙计,它适用于 Eclipse Luna、Windows XP、JDK 7 环境。但是在那个项目之后无法解决 Maven 依赖项。对这类问题有任何想法吗?
                • 谢谢老兄,拯救了我的一天。我想知道为什么这没有被标记为问题的答案。
                【解决方案9】:

                我认为我们找到了根本原因,所以这是我自己问题的答案。

                1. Mac OS X 10.5 中的 Java 系统属性“java.ext.dirs”为: /Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/ext. sunjce_provider.jar 应该在 /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/ext 中,但也可以在问题 mac 中的 /Library/Java/Extensions/ 中找到。

                2. /Library/Java/Extensions/ 中的 sunjce_provider.jar 属于 Java Cryptography Extension(JCE) 1.2.2,已安装在 mac 中。 JCE 1.2.2 是 J2SE 1.3.1 的一个可选包,可能没有包含足够的 J2SE 1.4 及更高版本的库。

                3. 从 /Library/Java/Extensions/ 中删除所有与 JCE 1.2.2 相关的 jar 文件后,Java 应用程序正常工作。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-05-05
                  • 2017-05-08
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多