2010-05-20 20 views
10

我的應用程序試圖從JAVA加載RSA算法提供程序類時遇到錯誤。唯一的例外堆棧如下:SunTlsRsaPremasterSecret KeyGenerator不可用

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 

我GOOGLE了錯誤信息和最帖子說,這是因爲JVM找不到了sunjce_provider.jar。但是,我可以在/ Library/Java/Home/lib/ext文件夾中找到該文件。

該平臺是Mac OS X 10.6,Java版本是1.6.0_17。

我的問題是:

  1. 爲什麼JVM不搜索/庫/ Java的/首頁/ lib目錄/ JAR文件轉?
  2. 我們可以通過修改任何配置文件來更改CLASSPATH或java.ext.dirs屬性嗎?
  3. 有沒有解決這個問題的建議?

在此先感謝。

回答

2

我想我們找到根本原因,所以這裏是我自己的問題的答案。

  1. 在Mac OS X 10.5的Java系統屬性 「java.ext.dirs」 是: /圖書館/的Java /擴展:/系統/庫/的Java /擴展:/系統/資源庫/框架/ JavaVM的.framework /版本/ 1.6.0 /主頁/ lib/ext目錄。 sunjce_provider.jar應該在/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/ext中,但也可以在/ Library/Java/Extensions /中找到問題mac。

  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. 所有與JCE 1.2.2相關的jar文件已從/ Library/Java/Extensions /中刪除後,Java applcation正常工作。

18

在Mac上升級到新的Java版本後,我遇到了同樣的問題。 我的(maven)項目從命令行運行正常,但在Eclipse中出現「SunTlsRsaPremasterSecret」錯誤。

解決方案是在Eclipse配置中刪除已安裝的JRE並再次添加它們(使用「搜索...」按鈕)。

+2

這也適用於我。我必須從首選項 - > Java - >已安裝的JRE中刪除所有JRE條目。它不允許我刪除最後一個,所以我不得不添加一個不同的名稱,然後刪除原來的。然後重新添加它們。 – Gray 2011-04-06 19:53:22

+0

我將指向eclipse的eclipse添加到了一個指向JDK的符號鏈接文件夾。刪除並讀取到Eclipse的真實文件夾解決了我的問題。 – 2014-07-09 19:13:27

+0

我在Windows 7 JDK 1.8.0_05上的Eclipse Luna中遇到了同樣的問題;此修復工作,雖然我必須在生效之前重新啓動Eclipse。 – Sbodd 2014-10-22 22:38:06

6

也有類似的問題。將類路徑添加到ext目錄爲我解決了它。此修補程序適用於我在Windows 7上用java 1.6

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

謝謝你;你救了我的世界!在經歷了幾個小時的挫折之後,這也解決了我的問題 – alpha 2013-02-25 01:29:57

+0

我面臨同樣的問題。你可以看看我的帖子嗎?http://stackoverflow.com/questions/19432051/ssl-ioexceptionjavax-net-ssl-sslkeyexception-rsa-premaster-secret-error?noredirect = 1#comment28809828_19432051 – 2013-10-17 16:51:30

1

它發生在我從eclipse啓動tomcat服務器時。我通過在Windows中更改配置來解決它 - >首選項 - > Java - >已安裝的JRE - >編輯。我不得不更新所有與該文件夾對應的罐子JRE系統庫:

  • %JAVA_HOME%/ JRE/lib/ext目錄
  • %JAVA_HOME%/ JRE/lib中/

看來在上次更新之後,我更改了JRE_Home,但忘記了這些庫。

enter image description here

0

不得不幾乎每天花費在此,而試圖在Eclipse月神來使用JavaMail。 嘗試了各種論壇中提出的所有方法,但沒有運氣。

挖孔成完整的流量和所產生的發現由於類的例外是BOOTCLASSPATH

從KeyAgreement.getInstance() - > JceSecurity.canUseProvider() - > JceSecurity.getVerificationResult() - > JarVerifier。驗證()

空隙驗證() 拋出JarException,IOException異常 { 如果(jarURL == NULL){ 擲新JarException( 「類是在引導類路徑」); } .......

我從\ ext \文件夾中刪除了sunjce_provider jar文件,現在可以發送郵件了。 這可能是不對的,但至少是一個快速的解決方法。

參照Eclipse bug

0

我也有這個問題,注意到問題出在我的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