1. 程式人生 > >Android 端Https 訪問

Android 端Https 訪問

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