2011-05-27 139 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运行的用户的打开文件限制。