詳細(xì)的https介紹及處理,大家可以去看這篇文章http://www.cnblogs.com/alisecurity/p/5939336.html
本篇又是簡單的功能實現(xiàn),對原理不分析。既然我們要對https請求做處理,那么我們把url修改一下:
private String GET_URL_HTTPS= "https://kyfw.12306.cn/otn/leftTicket/init"; run(GET_URL_HTTPS);//Https請求
因為12306使用的是自簽名證書,如果使用瀏覽器則會出現(xiàn)下圖提示,如果使用okhttp則提示(java.security.cert.CertPathValidatorException: Trust anchor for certification path not found), 這個時候瀏覽器可以選擇繼續(xù)訪問或者安裝證書,繼續(xù)訪問默認(rèn)的是讓瀏覽器無條件信任該證書,下載證書則是客戶端驗證證書的過程。而okhttp則需要我們手動去實現(xiàn),本篇文章實現(xiàn)的是okhttp本地添加證書校驗的過程,無條件信任證書不講解。

訪問拒絕
- 1 首先將證書導(dǎo)出到本地,我使用的chrome瀏覽器,其他請自己查詢辦法,點擊圖二的小鎖按鈕,然后再點擊詳細(xì)信息會彈出圖三,點擊view certificate按鈕跳到圖四,然后復(fù)制到文件選擇base64編碼格式即可將文件導(dǎo)出到本地,我命名為12306.cer,將它copy到assert目錄下

圖二

圖三

圖四

圖五
- 2 okhttp添加證書,我們在初始化okhttpclient的之前把證書添加上去,代碼如下
//通過 OkHttpClient.Builder來創(chuàng)建OkHttpClient,正常我們使用時也應(yīng)該這樣創(chuàng)建,這樣我們可以在builder中添加超時時間,日志打印,添加header等等!
OkHttpClient.Builder builder = new OkHttpClient.Builder();
addCertificate(getAssets().open("12306.cer"), builder);
//添加證書
public void addCertificate(InputStream certificate, OkHttpClient.Builder builder) {
try {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");//設(shè)置證書格式
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
keyStore.setCertificateEntry("12306", certificateFactory.generateCertificate(certificate));
final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
client = builder.sslSocketFactory(sslContext.getSocketFactory()).build();
} catch (Exception e) {
e.printStackTrace();
}
}
好了這個時候你再去請求,就能正常返回結(jié)果了。
代碼已經(jīng)上傳:https://github.com/MrAllRight/HttpExample