close

最近又回頭寫Java的程式,遇到的問題是要去呼叫https secure url,結果一直有Exception產生。

Exception:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found

網路上的解法不少。但是我試了好幾個還是覺得
這篇作者的解法最容易,也較容易理解。

另外這篇也不錯。

给有可能遇到跟我一樣問題的人參考囉!順便我自己也可以把這樣的問題記錄起來,方便自己以後找問題。




我把作者個code整理如下:

package com.xxx.xxx.util;

import java.security.KeyManagementException;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.security.Security;

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;

import javax.net.ssl.TrustManager;

import javax.net.ssl.X509TrustManager;

import com.sun.net.ssl.HostnameVerifier;

import com.sun.net.ssl.HttpsURLConnection;

public class SSlTrustManagerTool {

 private SSlTrustManagerTool() {

 }

private static org.apache.log4j.Category logger = org.apache.log4j.Category.getInstance(SSlTrustManagerTool.class);

public static void trustHttpsCertificates() throws NoSuchAlgorithmException, KeyManagementException {   

  Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());  

  // Create a trust manager that does not validate certificate chains:   

  TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {

        public X509Certificate[] getAcceptedIssuers() {       

           logger.info("getAcceptedIssuers");       

          return null;     

        }     

        public void checkServerTrusted(X509Certificate[] certs,String authType) throws CertificateException {      

        logger.info("checkServerTrusted");       

        return;     

       }     

      public void checkClientTrusted(X509Certificate[] certs,String authType) throws CertificateException {       

        logger.info("checkClientTrusted");      

        return;     

      }   

   } // X509TrustManager   

   };// TrustManager[]   

   // Install the all-trusting trust manager:

    SSLContext sc = SSLContext.getInstance("SSL");   

    sc.init(null, trustAllCerts, new SecureRandom());   

    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());   

    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {    

      public boolean verify(String hostname, String session) {       

        logger.info(hostname + " " +  session + " is accepted!");      

        return true;      }  

    }

    );

    }

}



另外使用的方式如下:

URL url=new

URL(
https://www.xxx.xxx
);

com.xxx.xxx.util.SSlTrustManagerTool.trustHttpsCertificates();

//parse output data

String res=new String();

StringBuffer StrBuffer = new StringBuffer();

BufferedReader oIn = new BufferedReader(new InputStreamReader(url.openStream()));

這樣就可以達成Connect to https by Java 囉!!


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 pcshu 的頭像
    pcshu

    pcshu@城市角落

    pcshu 發表在 痞客邦 留言(0) 人氣()