Android 端Https 訪問
阿新 • • 發佈:2018-12-15
Https 介面使用環境,伺服器端一個證書,生成一個客戶端證書,在訪問服務介面時使用客戶端證書,訪問伺服器端https,增強對傳輸安全。
在開發過程中使用okhttp框架來實現https訪問自簽名的介面。首先拿到後臺自簽名證書sChat.cer 放在assets裡面。通過getAssets().open("sChat.cer");來讀取
以下為
OkHttpClient client=null;
InputStream in=getResources().getAssets().open("sChat.cer");
String result=null;
//生成工廠類例項
CertificateFactory certificateFactory=CertificateFactory.getInstance ("x509");//一種普通的證書格式 符合ITU-T X 509國際標準
//獲取到證書
Certificate ca = certificateFactory.generateCertificate(in);
in.close();
//這裡面用的證書沒有設定私鑰,執行空載入
keyStore.load(null,null);
//將得到的證書存放到KeyStore裡
keyStore.setCertificateEntry("ca", ca);
//請求安全套接字類 TLC請求協議
SSLContext sslContext = SSLContext.getInstance ("TLS");
//初始化SSL
TrustManagerFactory trustManagerFactory=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
//建立http客戶端
client=new OkHttpClient();
Request request=new Request.Builder().url(url).build();
Log.d(ProjectAssist.TAG, "httpsCheckConnect "+url);
Response response=client.newCall(request).execute();
if(response.isSuccessful()){
result=response.body().string();
}
但是在執行的時候
javax.net.ssl.SSLPeerUnverifiedException: Hostname host not verified
SSL 驗證伺服器證書 Hostname 不匹配
向大神請教的是HostnameVerifier不設定的話,預設返回false,需要自定義實現一個HostnameVerifier
在clinet訪問之前設定hostname認證 在裡面新增需要的業務伺服器地址,進行認證
client.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
// 判斷hostname 的合法性,是否是移動端訪問的地址
return true;
}
});