詳細(xì)的https介紹及處理丽蝎,大家可以去看這篇文章http://www.cnblogs.com/alisecurity/p/5939336.html
本篇又是簡(jiǎn)單的功能實(shí)現(xiàn)批狐,對(duì)原理不分析雇初。既然我們要對(duì)https請(qǐng)求做處理,那么我們把url修改一下:
private String GET_URL_HTTPS= "https://kyfw.12306.cn/otn/leftTicket/init"; run(GET_URL_HTTPS);//Https請(qǐng)求
因?yàn)?2306使用的是自簽名證書,如果使用瀏覽器則會(huì)出現(xiàn)下圖提示,如果使用okhttp則提示(java.security.cert.CertPathValidatorException: Trust anchor for certification path not found)寒跳, 這個(gè)時(shí)候?yàn)g覽器可以選擇繼續(xù)訪問或者安裝證書,繼續(xù)訪問默認(rèn)的是讓瀏覽器無條件信任該證書竹椒,下載證書則是客戶端驗(yàn)證證書的過程童太。而okhttp則需要我們手動(dòng)去實(shí)現(xiàn),本篇文章實(shí)現(xiàn)的是okhttp本地添加證書校驗(yàn)的過程,無條件信任證書不講解书释。
訪問拒絕
- 1 首先將證書導(dǎo)出到本地翘贮,我使用的chrome瀏覽器,其他請(qǐng)自己查詢辦法爆惧,點(diǎn)擊圖二的小鎖按鈕狸页,然后再點(diǎn)擊詳細(xì)信息會(huì)彈出圖三,點(diǎn)擊view certificate按鈕跳到圖四扯再,然后復(fù)制到文件選擇base64編碼格式即可將文件導(dǎo)出到本地肴捉,我命名為12306.cer,將它c(diǎn)opy到assert目錄下
圖二
圖三
圖四
圖五
- 2 okhttp添加證書叔收,我們?cè)诔跏蓟痮khttpclient的之前把證書添加上去,代碼如下
//通過 OkHttpClient.Builder來創(chuàng)建OkHttpClient傲隶,正常我們使用時(shí)也應(yīng)該這樣創(chuàng)建饺律,這樣我們可以在builder中添加超時(shí)時(shí)間,日志打印跺株,添加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();
}
}
好了這個(gè)時(shí)候你再去請(qǐng)求,就能正常返回結(jié)果了乒省。
代碼已經(jīng)上傳:https://github.com/MrAllRight/HttpExample