在網上找了好多例子,但是都沒有我想要的。我的要求是,程序可以自動完成證書導入然后與服務器交換數據。
網上的例子是可以工作的,前提是要訪問的網站的證書已經導入到本機。但是作為java的訪問一個未知的https網站,不可能都手動的導入進去,所以這些例子不太好,但是又沒有找到合適的,有的也不能工作,我研究一下爭取可以發一個可以傻瓜直接運行的例子。
下邊這個例子是可以直接運行的,也是我這次任務所要完成的,至於具體的原理鄙人也不知,總之先比葫蘆畫瓢等隨后在慢慢剖析。
貌似對這樣的可以通過的代碼有點感覺就是,java有一個默認的cert checker是需要你本機有目標網站的證書,如果沒有就會拋出異常,但是在我們這里,我們自己定義了一個cerrt checker去替換默認的,我們這里的實現也是對於檢查什么都沒做,所以這樣的code對於任何的一個https網站都是可以通過的,這也貌似是code的簡單原理。。
package test; import java.net.URL; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; public class HttpsTest { public static void main(String[] args) { new HttpsTest().doMain(); log("DONE"); } public void doMain() { String hsUrl = "https://localhost:8443/testApp/hel.jsp"; hsUrl = "https://google.com"; hsUrl = "https://vip1.icbc.com.cn/icbc/perbank/index.jsp"; URL url ; try { url = new URL(hsUrl); HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); X509TrustManager xtm = new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } @Override public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } @Override public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } }; TrustManager[] tm = { xtm }; SSLContext ctx = SSLContext.getInstance("TLS"); ctx.init(null, tm, null); con.setSSLSocketFactory(ctx.getSocketFactory()); con.setHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String arg0, SSLSession arg1) { return true; } }); log(con.getResponseCode()); log(con.getCipherSuite()); log(""); Certificate[] certs = con.getServerCertificates(); int certNum = 1; for(Certificate cert : certs) { X509Certificate xcert = (X509Certificate) cert; log("Cert No. " + certNum ++); log(xcert.getType()); log(xcert.getPublicKey().getAlgorithm()); log(xcert.getIssuerDN()); log(xcert.getIssuerDN()); log(xcert.getNotAfter()); log(xcert.getNotBefore()); log(""); } } catch (Exception e) { e.printStackTrace(); } } static void log(Object o) { System.out.println(o); } }