小弟的项目需求是 抓取需要USB证书认证页面的源代码,现在当抓取证书页面时就报如下的错误,请高手指点指点
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1518)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:848)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:818)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1057)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1041)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:402)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:170)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:938)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:367)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
at com.ynitil.sinfo.servlet.capture.Capture.GetWebContent(Capture.java:273)
at com.ynitil.sinfo.servlet.capture.Capture.GetWebContent(Capture.java:316)
at com.ynitil.sinfo.servlet.capture.Capture.doPost(Capture.java:220)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.ynitil.sinfo.servlet.CharsetFilter.doFilter(CharsetFilter.java:54)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:595)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:221)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145)
at sun.security.validator.Validator.validate(Validator.java:203)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172)
at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841)
... 32 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)
... 37 more
抓取页面的核心代码是
 /**
    *网页抓取方法
    * @param urlString      要抓取的url地址
    * @param charset        网页编码方式
    * @param timeout        超时时间
    * @return               抓取的网页内容
    * @throws IOException   抓取异常
    */
   public static String GetWebContent(String urlString, final String charset, int timeout) throws IOException {
       if (urlString == null || urlString.length() == 0) {
           return null;
       }
       urlString = (urlString.startsWith("http://") || urlString.startsWith("https://")) ? urlString : ("http://" + urlString).intern();
       URL url = new URL(urlString);        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
       GetProxy();
       conn.setRequestProperty(
               "User-Agent",
               "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");//增加报头,模拟浏览器,防止屏蔽
       conn.setRequestProperty("Accept", "text/html");//只接受text/html类型,当然也可以接受图片,pdf,*/*任意,就是tomcat/conf/web里面定义那些        conn.setConnectTimeout(timeout);
       try {
           if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
               return null;
           }
       } catch (IOException e) {
           e.printStackTrace();
           return null;
       }
       InputStream input = conn.getInputStream();
       BufferedReader reader = new BufferedReader(new InputStreamReader(input,
               charset));
       String line = null;
       StringBuffer sb = new StringBuffer();
       while ((line = reader.readLine()) != null) {
           sb.append(line).append("\r\n");
       }
       if (reader != null) {
           reader.close();
       }
       if (conn != null) {
           conn.disconnect();
       }
       return sb.toString();    }

解决方案 »

  1.   


    sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    还是你证书没有被认证的问题。。我也好久没碰过证书的东西了。。只能帮你搜些答案。。下面看看应该能解决你的问题:
    http://wanglei0119.iteye.com/blog/607046
    http://blog.knowsky.com/107645.htm
      

  2.   


    应该是根证书,就是吉大正元的证书,在网上找了很多的资料,配置了SSL配置文件,但又报其他的错误了,是我配得文件不对,还是怎么着啊
      

  3.   

    将根证书导入到jre\lib\security\cacerts  再试试看
      

  4.   

    最终是用C#做了个桌面应用程序,用到了一个webBrowser控件