阅读本文之前,请先阅读下文,通过下文将获取到keystore文件:
http://www.oschina.net/code/snippet_273576_18919
在此,感谢一下stevenliu ,不过经过我的测试,发现stevenliu 文章中的源码并没有抓取到页面源码。可能是我项目里面的HttpClient版本较高的原因。下面这个方法没有问题:
1package org.phoenix.cases.webservice; 2import java.io.FileInputStream; 3import java.io.InputStreamReader; 4import java.net.URL; 5import java.security.KeyStore; 6import java.security.SecureRandom; 7import java.security.cert.CertificateException; 8import java.security.cert.X509Certificate; 9import java.util.List; 10import javax.net.ssl.HttpsURLConnection; 11import javax.net.ssl.SSLContext; 12import javax.net.ssl.SSLSocketFactory; 13import javax.net.ssl.TrustManager; 14import javax.net.ssl.TrustManagerFactory; 15import javax.net.ssl.X509TrustManager; 16import org.apache.commons.io.IOUtils; 17/** 18 * java通过加载认证证书,抓取https的url源码方法 19 * @author mengfeiyang 20 * 21 */ 22public class MyX509TrustManager implements X509TrustManager { 23 private X509TrustManager sunJSSEX509TrustManager; 24 25 public MyX509TrustManager(String keystoreFile,String pass) throws Exception { 26 KeyStore ks = KeyStore.getInstance("JKS"); 27 ks.load(new FileInputStream(keystoreFile),pass.toCharArray()); 28 TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509", "SunJSSE"); 29 tmf.init(ks); 30 TrustManager tms [] = tmf.getTrustManagers(); 31 for (int i = 0; i < tms.length; i++) { 32 if (tms[i] instanceof X509TrustManager) { 33 sunJSSEX509TrustManager = (X509TrustManager) tms[i]; 34 return; 35 } 36 } 37 throw new Exception("Couldn't initialize"); 38 } 39 40 @Override 41 public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 42 try { 43 sunJSSEX509TrustManager.checkClientTrusted(chain, authType); 44 } catch (CertificateException excep) { 45 excep.printStackTrace(); 46 } 47 } 48 @Override 49 public void checkServerTrusted(X509Certificate[] chain, String authType) { 50 try { 51 sunJSSEX509TrustManager.checkServerTrusted(chain, authType); 52 } catch (CertificateException excep) { 53 excep.printStackTrace(); 54 } 55 } 56 @Override 57 public X509Certificate[] getAcceptedIssuers() { 58 return sunJSSEX509TrustManager.getAcceptedIssuers(); 59 } 60 61 public static void main(String[] args) throws Exception { 62 TrustManager[] tm = { new MyX509TrustManager("E:\\mycert.keystore","123456") }; 63 SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); 64 sslContext.init(null, tm, new SecureRandom()); 65 SSLSocketFactory ssf = sslContext.getSocketFactory(); 66 URL myURL = new URL("https://beta.tf.360.cn/search/mapi?keyword=途牛"); 67 HttpsURLConnection httpsConn = (HttpsURLConnection) myURL.openConnection(); 68 httpsConn.setSSLSocketFactory(ssf); 69 InputStreamReader insr = new InputStreamReader(httpsConn.getInputStream()); 70 List<String> ls = IOUtils.readLines(insr); 71 72 for(String l : ls){ 73 System.out.println(l);//打印源码 74 } 75 76 httpsConn.getResponseCode();//获取的状态码 77 } 78}
在我的phoenixframework自动化平台的接口测试模块中,下个版本将会增加https的操作。因为发现现在越来越多的网站是https了。phoenixframework平台网站:http://www.cewan.la