SunTlsRsaPremasterSecret密钥生成器不可用。

13

当我的应用程序尝试从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文件夹中找到该文件。
我的问题是:
1. 为什么JVM不在/Library/Java/Home/lib/ext中搜索jar文件? 2. 我们能否通过修改任何配置文件来更改CLASSPATH或java.ext.dirs属性? 3. 有什么建议来解决这个问题吗?
提前感谢您的帮助。
9个回答

27

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

解决方法是在 Eclipse 配置中删除已安装的 JRE 并重新添加它们(使用 "搜索..." 按钮)。


3
这对我也起作用了。我不得不从“首选项”->“Java”->“已安装的JRE”中删除所有JRE条目。它不允许我删除最后一个,所以我不得不添加一个不同名称的并删除原来的那个。然后重新添加它们全部。 - Gray
我将我的指向Eclipse的符号链接文件夹指向了JDK。将真实文件夹从Eclipse中移除并重新添加解决了我的问题。 - Ali Cheaito
我在Windows 7上使用Eclipse Luna和JDK 1.8.0_05时遇到了同样的问题;这个修复方法有效,但是在生效之前我不得不重新启动Eclipse。 - Sbodd
谢谢,这对我来说很有用,我在Eclipse Luna、Windows XP和JDK 7环境下使用了它。但是在那之后,项目无法解析Maven依赖项。你有关于这种问题的任何想法吗? - Chintan Patel
谢谢,老兄,救了我的一天。我想知道为什么这个答案没有被标记为问题的答案。 - ppuskar

8

我曾经遇到过类似的问题。将classpath添加到ext目录中解决了我的问题。这个修复方法在我使用Windows 7和Java 1.6时有效。

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

谢谢,你救了我的世界!在苦恼了几个小时之后,这解决了我的问题。 - alpha
我遇到了同样的问题。你能否请看一下我的帖子?http://stackoverflow.com/questions/19432051/ssl-ioexceptionjavax-net-ssl-sslkeyexception-rsa-premaster-secret-error?noredirect=1#comment28809828_19432051 - Ramesh Sangili

3

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

  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应用程序正常工作。


1

我也遇到了这个问题,注意到问题在我的Eclipse配置中。

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

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

1
在使用Eclipse启动Tomcat服务器时,我遇到了这个问题。我通过更改Windows -> Preferences -> Java -> Installed JREs -> Edit中的配置来解决它。我必须使用以下文件夹中对应的JAR更新所有JRE系统库:

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

看起来在最后一次更新后,我改变了JRE_Home但忘记了这些库。

enter image description here


0

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

深入研究了整个流程,并发现由于类位于BootClassPath上而引起异常

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

void verify() throws JarException, IOException { if (jarURL == null) { throw new JarException("Class is on the bootclasspath"); }.......

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

请参阅Eclipse bug


0

我知道,我来晚了。但对我来说,当我将首选项 -> Java -> 已安装的JREs -> 执行环境更改为JavaSE-1.8到jdk1.8路径时,这个错误突然出现了。但它应该是jre1.8路径。

我不知道为什么现在会发生这种情况。但它解决了问题。


0
可能的解决方案:检查JDK路径是否设置到C:\Program Files\Java\jdk1.8.0_171,但不包括bin目录。

0
在我的情况下,我遇到了上述相同的问题,在阅读了上述解决方案之后,我更改了JRE定义并恢复了默认设置。现在它正常工作。 {{link1:输入图像描述}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接