https域名強弱校驗的區別


HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){  
    public boolean verify(String hostname,SSLSession ssls) {  
            return true;  
        }  
});  

以上是域名若校驗,如果當前https已經添加了本地證書實現了證書校驗,那么域名可以作為一個弱校驗也是沒有問題的。

但是如果證書不想在app中保留,給https設置了信任所有證書,那么就需要設置域名的強校驗來保證https訪問目標的准確性,可以本地預埋域名,然后解析跟目標服務器連接緩存SSLSession中的peerhost和cn字段的域名,能夠保證目標的准確性。  

 

  ssls是從服務器拿到的ssl證書相關(具體待驗證)   

  hostname是訪問的url的域名

  https默認驗證不通過時,可以自己重寫這個方法,如果返回true,表示強制信任此證書,就是通常的弱信任。如果需要自己做操作,可以從ssls里面拿到服務器返回的證書數據,同自己請求的域名、證書簽證的域名、證書接收的url的域名做對比,匹配規則需要自己確認。這個域名也有可能是ip,具體看情況而定

 

以下是域名的強校驗

 

request.setHostnameVerifier(new HostnameVerifier() {
			@Override
			public boolean verify(String hostname, SSLSession session) {
				// TODO Auto-generated method stub
				try {
					String peerHost = session.getPeerHost(); //服務器返回的主機名
					String str_new = "";
					X509Certificate[] peerCertificates = (X509Certificate[]) session
							.getPeerCertificates();
					for (X509Certificate certificate : peerCertificates) {
						X500Principal subjectX500Principal = certificate
								.getSubjectX500Principal();
						String name = subjectX500Principal.getName();
						String[] split = name.split(",");
						for (String str : split) {
							if (str.startsWith("CN")) {//證書綁定的域名或者ip
								if (peerHost.equals(hostname)&&str.contains("客戶端預埋的證書cn字段域名")) {
									return true;
								}
							}
						}
					}
				} catch (SSLPeerUnverifiedException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				return false;
			}
		});

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM