java.security.cert.CertificateException: No subject alternative names present

記一次單點登錄https中證書無效的問題:

背景環境:單點登錄(cas)使用tomcat私有證書,即https;被集成的系統使用http;

百度了一堆,大概原理就是說:

在開發設計中當我們在java中打開一個SSL連接(比如:java.net.URL.openConnection(“https://….”)), JSSE實現的SSL協議執行一些驗證以確保這個請求的主機不是假的。 這包括用PKIX算法驗證服務器的X.509證書和檢查主機名稱與證書中的subject是否一致。 如果SSL證書不可信或與目標主機不匹配,HTTPS和SSL加密連接就不能建立並且拋出SSLHandshakeException 或 IOException。

公司大佬也是說單點登錄的包裏面如果是https請求會有驗證證書的算法,所以就只能去找到源碼的請求處理方法,默認不驗證證書或者直接讓證書通過。最終鎖定在了(使用的cas-client-core-3.2.2.jar)java-cas-client-cas-client-3.2.2\cas-client-core\src\main\java\org\jasig\cas\client\util\CommonUtils.java中,糅合了n多博客,在代碼中加了如下代碼

  static TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
      }

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

      public X509Certificate[] getAcceptedIssuers() {
          return null;
      }
  } };
之後在源碼的getResponseFromServer方法try代碼塊中添加了以下代碼
      SSLContext sslcontext = SSLContext.getInstance("SSL");
	  sslcontext.init(null, trustAllCerts, new SecureRandom());
	  HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
		public boolean verify(String s, SSLSession sslsession) {				
				return true;
		}
	  };
      HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
	  HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());

編譯之後把源碼重新編譯後打成jar包替換原來的jar包,問題解決,雖然問題解決了但是深入原理還是有待學習的,僅在此記錄解決方案,供以後學習

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章