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;
}
});
