当我的应用程序尝试从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。
我的问题是:
提前致谢。
答案 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)
我认为我们找到了根本原因,所以这里是我自己问题的答案。
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 /中找到。
/ 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及更高版本的库。
Java applcation在从/ Library / Java / Extensions /中删除所有JCE 1.2.2相关jar文件后正常工作。
答案 3 :(得分:1)
从eclipse启动tomcat服务器时发生了这件事。我通过更改Windows中的配置解决了这个问题 - &gt;偏好 - &gt; Java - &gt;已安装的JRE - &gt;编辑。我必须使用以下文件夹中相应的jar更新所有JRE系统库:
似乎在上次更新后我更改了JRE_Home但忘了那些库。
答案 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