1. 程式人生 > >java https繞過伺服器端證書

java https繞過伺服器端證書

整這個程式碼真有夠麻煩的。
先說原理吧,https網站伺服器都是有證書的! 之所以google和12306表現不一,是因為12306的證書是什麼 “SRCA”,鐵道部自己的CA伺服器簽發的,並不被瀏覽器或作業系統(至少我的firefox就不認它)廣泛接受!
Google的證書也是Google的CA伺服器簽發的,不過被認可,沒辦法。。。
建行CCB的證書是VeriSign簽發的,這個基本所有的地方都認。

好了,解決方法:1.把這個SRCA簽發的證書匯入系統。這個windows下匯入IE即可,具體不說了;2.我們在程式中 不讓它去驗證 伺服器證書(這種方法僅用於測試!)

程式碼如下,給出一個空的TrustManager來繞過SSL 伺服器證書驗證:

  1. @Test
  2. publicvoid test14()throwsException{
  3.     URL url =new URL("https://dynamic.12306.cn/otsweb/main.jsp");
  4. HttpsURLConnection conn =(HttpsURLConnection) url.openConnection();
  5. SSLContext sc =SSLContext.getInstance("SSL");
  6. TrustManager[] tmArr={new X509TrustManager(){
  7. @Override
  8. publicvoid checkClientTrusted
    (X509Certificate[] paramArrayOfX509Certificate,String paramString)throwsCertificateException{}
  9. @Override
  10. publicvoid checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate,String paramString)throwsCertificateException{}
  11. @Override
  12. public X509Certificate[] getAcceptedIssuers(){returnnull;}
  13. }};
  14.     sc
    .init(null, tmArr,newSecureRandom());
  15.     conn.setSSLSocketFactory(sc.getSocketFactory());
  16.     conn.connect();
  17. try(BufferedReader br =newBufferedReader(newInputStreamReader(conn.getInputStream()))){
  18. String input;
  19. while((input = br.readLine())!=null)
  20. System.out.println(input);
  21. }
  22. }