【问题标题】:HttpClient+SSL from GlassfishGlassfish 的 HttpClient+SSL
【发布时间】:2011-06-21 10:20:44
【问题描述】:

我正在尝试从受 SSL 保护的网页下载一个简单页面。我正在使用 HtmlUnit 来完成该任务(围绕 HttpClient)。

我尝试下载的网页有一个由 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 中禁用安全管理器,但没有帮助。

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

提前致谢。

【问题讨论】:

    标签: java ssl glassfish httpclient htmlunit


    【解决方案1】:

    我以为 GlassFish 使用了它自己的神奇密钥库:

    http://metro.java.net/guide/Configuring_Keystores_and_Truststores.html

    祝你好运!

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您可以将证书链导入信任库并设置以下 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 信任库。因此,如果您使用不同的证书访问不同的站点,您可能希望将它们全部导入一个信任库。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-13
          • 1970-01-01
          • 1970-01-01
          • 2017-02-25
          • 2011-02-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多