2011-05-27 140 views
1

錯誤:與ssl服務器的ssl握手。 After:client hello,server hello,certificate,server key exchange and server hello done。在網絡應用程序崩潰,: java.lang.NoClassDefFoundError:javax.crypto.SunJCE_btomcat ssl客戶端握手java錯誤

上出現的問題無法初始化類:
的Tomcat 6.0.29

嘗試了以下JVM:
1.5 ,1.6_22,1.6_25
現在正在運行:
Java的版本 Java版本 「1.6.0_25」 的Java(TM)SE運行時環境(建立1.6.0_25-B06) 的HotSpot的Java(TM)服務器VM(建立20.0- B11,混合模式)

操作系統:
UNAME -a
SunOS的主機名5.10 Generic_118833-33 SUN4V SPARC SUN4V

更多細節:

的堆棧跟蹤:

java.lang.NoClassDefFoundError: Could not initialize class javax.crypto.SunJCE_b 
    javax.crypto.KeyGenerator.a(DashoA13*..) 
javax.crypto.KeyGenerator.<init>(DashoA13*..) 
javax.crypto.KeyGenerator.getInstance(DashoA13*..) 
com.sun.net.ssl.internal.ssl.JsseJce.getKeyGenerator(JsseJce.java:223) 
com.sun.net.ssl.internal.ssl.RSAClientKeyExchange.<init>(RSAClientKeyExchange.java:89) 
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:744) 
com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:238) 
com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593) 
com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529) 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893) 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138) 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:632) 
com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59) 
com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:73) 
com.gosselinchristian.SSLPokeServlet.doGet(SSLPokeServlet.java:86) 

該代碼:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) { 
    try { 

     System.out.println(getClasspathString()); 
     System.out.println(getPropertiesString()); 

     SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory 
       .getDefault(); 
     SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
       "some_server", 443); 

     InputStream in = sslsocket.getInputStream(); 
     OutputStream out = sslsocket.getOutputStream(); 



     // Write a test byte to get a reaction :) 
     out.write(1); 

     while (in.available() > 0) { 
      System.out.print(in.read()); 
     } 

     System.out.println("Successfully connected"); 

    } catch (Exception exception) { 
     exception.printStackTrace(); 
    } 
} 

一些tomcat的啓動選項:

JAVA_OPTS='-server -Dapp.name=TEST -Dfile.encoding=ISO-8859-1 -XX:PermSize=128m -XX:MaxPermSize=128m -Xms512m -Xmx2048m -Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol -Djavax.net.ssl.trustStore=/export/home/user/some_server_certs -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.debug=all' 

相同的代碼,同一JVM,在其他環境中相同的證書工作。任何人都知道這可能出錯哪裏?

+0

btw我可以通過簡單地在提示符上運行一個Java類來重現問題,從而從等式中消除了tomcat。該類是發現的SSLPoke [here](http://goo.gl/sS2v1),命令行是:java -Djavax.net.ssl.trustStore = ./ some_server_certs -Djavax.net.debug = all SSLPoke some_server。 com 443 – cgos 2011-05-27 11:58:07

回答

1

-Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol

擺脫這一開始,這是七年過時了。它僅適用於JDK 1.3。

您的JRE安裝有問題。重新安裝,然後確保Tomcat正在使用新安裝的版本。

+0

感謝提示,我已經使用自解壓二進制文件從頭開始重新安裝JRE。我還嘗試了其他兩種JDK安裝。 – cgos 2011-05-27 03:15:02

1

javax.crypto.SunJCE_b課程位於Sun JDK/JRE的<JAVA_HOME>/lib/jce.jar中。它應該由引導類加載器加載。加載此類的失敗表明您的Web應用程序的類加載機制有些不合適,並且可能對於Tomcat也是如此。

你可能要檢查

  • 如果JRE/JDK包含此JAR。
  • 如果以某種方式設置變量CLASSPATH,導致加載不同的歸檔文件,或者根本不加載。這一點通常不適用,因爲引導類加載器應該加載類,而不是系統類加載器(依賴於此環境變量)。
  • 如果您的任何應用程序正在使用AOP樣式技術來檢測javax.crypto。*類。您可能希望配置這樣的應用程序以從儀表中排除這些類(主要)。簡而言之,請驗證自定義類加載器的實現。
+0

我試過的所有JRE都包含jce.jar。在我最近的嘗試(請參閱問題的新評論)我沒有其他的類路徑,然後JAVA_HOME。沒有AOP,簡單地打開一個SSLSocket的非常基本的Java類。 – cgos 2011-05-27 12:10:20

+0

更新後,sys管理員安裝了所有最新的補丁後,java/ssl問題消失了。高興。我正要嘗試修改安全提供程序,如[此處]所示(https://forums.aws.amazon.com/message.jspa?messageID=79411) – cgos 2011-05-28 11:30:41

1

這是一箇舊帖子,但我只是迴應,以防其他人偶然發現這一點。我們在我們的服務器上遇到了這個錯誤,這個問題實際上與打開的文件限制有關。檢查您打開的文件限制。如果它是像1024這樣的東西,那麼你可能有同樣的問題。增加Tomcat運行的用戶的打開文件限制。