SunTlsRsaPremasterSecret KeyGenerator不可用

时间:2010-05-20 09:38:17

标签: java macos

当我的应用程序尝试从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不搜索jar文件的/ Library / Java / Home / lib / ext?
  2. 我们可以通过修改任何配置文件来更改CLASSPATH或java.ext.dirs属性吗?
  3. 有任何解决此问题的建议吗?
  4. 提前致谢。

8 个答案:

答案 0 :(得分:23)

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

解决方案是删除Eclipse配置中的Installed JRE并再次添加它们(使用“Search ...”按钮)。

答案 1 :(得分:7)

有类似的问题。将类路径添加到ext目录为我修复了它。这个修复在Windows 7上使用java 1.6

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

答案 2 :(得分:2)

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

  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. Java applcation在从/ Library / Java / Extensions /中删除所有JCE 1.2.2相关jar文件后正常工作。

答案 3 :(得分:1)

从eclipse启动tomcat服务器时发生了这件事。我通过更改Windows中的配置解决了这个问题 - &gt;偏好 - &gt; Java - &gt;已安装的JRE - &gt;编辑。我必须使用以下文件夹中相应的jar更新所有JRE系统库:

  • %JAVA_HOME%/ JRE / lib / ext目录
  • %JAVA_HOME%/ JRE / LIB /

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

enter image description here

答案 4 :(得分: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中的等价物。

答案 5 :(得分:0)

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

深入研究完整流程,发现由于 Class出现在BootClassPath

引起的异常 来自KeyAgreement.getInstance()的

- &gt; JceSecurity.canUseProvider() - &gt; JceSecurity.getVerificationResult() - &gt; JarVerifier.verify()

void verify()           抛出JarException,IOException         {      if(jarURL == null){        抛出新的JarException(&#34; Class在bootclasspath&#34;);      } .......

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

参考Eclipse bug

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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