java https繞過伺服器端證書
阿新 • • 發佈:2019-01-26
整這個程式碼真有夠麻煩的。
先說原理吧,https網站伺服器都是有證書的! 之所以google和12306表現不一,是因為12306的證書是什麼 “SRCA”,鐵道部自己的CA伺服器簽發的,並不被瀏覽器或作業系統(至少我的firefox就不認它)廣泛接受!
Google的證書也是Google的CA伺服器簽發的,不過被認可,沒辦法。。。
建行CCB的證書是VeriSign簽發的,這個基本所有的地方都認。
好了,解決方法:1.把這個SRCA簽發的證書匯入系統。這個windows下匯入IE即可,具體不說了;2.我們在程式中 不讓它去驗證 伺服器證書(這種方法僅用於測試!)
程式碼如下,給出一個空的TrustManager來繞過SSL 伺服器證書驗證:
- @Test
- publicvoid test14()throwsException{
- URL url =new URL("https://dynamic.12306.cn/otsweb/main.jsp");
- HttpsURLConnection conn =(HttpsURLConnection) url.openConnection();
- SSLContext sc =SSLContext.getInstance("SSL");
- TrustManager[] tmArr={new X509TrustManager(){
- @Override
- publicvoid checkClientTrusted
- @Override
- publicvoid checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate,String paramString)throwsCertificateException{}
- @Override
- public X509Certificate[] getAcceptedIssuers(){returnnull;}
- }};
- sc
- conn.setSSLSocketFactory(sc.getSocketFactory());
- conn.connect();
- try(BufferedReader br =newBufferedReader(newInputStreamReader(conn.getInputStream()))){
- String input;
- while((input = br.readLine())!=null)
- System.out.println(input);
- }
- }