2011-06-21 54 views
0

我试图从SSL安全的网页上下载一个简单的页面。我正在使用HtmlUnit来完成那个任务(包装HttpClient)。Glassfish的HttpClient + SSL

我试图下载的网页有一个由Verisign签署的正确证书,Verisign证书存在于cacerts文件中(它在那里,但我甚至重新导入了整个证书链)。

我的应用程序完全可以作为使用Glassfish使用的相同JVM的独立应用程序运行。但是如果我部署到Glassfish的我得到一个经典的证书有问题的例外:

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated, 
com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352) 
org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128) 
org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:339) 
org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:123) 
org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:147) 
org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108) 
org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415) 
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641) 
org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:597) 
com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:133) 
com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1405) 
com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1324) 
com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:303) 
com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:385) 

我已经尝试过在GlassFish中禁用安全管理器,并没有帮助。

这种奇怪行为的原因是什么?

在此先感谢。

回答

0

如果这是测试或临时代码,并且您不在意验证证书,请尝试accepting all certs and host names。使用SSLUtilities类:

SSLUtilities.trustAllHostnames(); 
SSLUtilities.trustAllHttpsCertificates(); 
0

您可以导入证书链到信任,并设置以下VM参数:

-Djavax.net.ssl.trustStore="<path to truststore file>" 
-Djavax.net.ssl.trustStorePassword="<passphrase for truststore>" 

或类似运行时覆盖的信任:

System.setproperty("javax.net.ssl.trustStore","<path to truststore file>") 
System.setproperty("javax.net.ssl.trustStorePassword","<passphrase for truststore>") 

保持请记住,这两个选项都将覆盖默认的JVM信任库。因此,如果您使用不同的证书访问不同的站点,则可能需要将其全部导入到一个信任库中。