對於CA機構頒發的證書Okhttp默認支持 可以直接訪問
但是對於自定義的證書就不可以了(如:https ://kyfw.12306.cn/otn/), 需要加入Trust
下面分兩部分來寫,一是信任所有證書,二是信任指定證書,訪問自簽名的網站
一、信任所有證書
1. 在你的module 下 build.gradule里添加
dependencies { 、、、 compile 'com.zhy:okhttputils:2.6.2' 、、、}
2.新建MyApplication
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); // 這就是信任所有證書 HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null,null, null); OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10000L, TimeUnit.MILLISECONDS) .readTimeout(10000L, TimeUnit.MILLISECONDS) .addInterceptor(new LoggerInterceptor("TAG")) .hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }) .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager) .build(); OkHttpUtils.initClient(okHttpClient); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
3.AndroidMainfest.xml
//添加權限 <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <application //將新建的MyApplication name添加進來 android:name=".MyApplication" .....
4.然后在需要請求網絡的地方
public void getHttps(View view) { String url = "https://kyfw.12306.cn/otn/"; OkHttpUtils .get() .url(url) .build() .execute(new StringCallback() { @Override public void onError(Call call, Exception e, int id) { Log.e("TAG", "onError: " + e.toString()); } @Override public void onResponse(String response, int id) { Log.e("TAG", "onResponse: " + response.toString()); } }); }
二、自定義的證書 自簽名網站
分兩種:1.直接使用網站證書;2.將證書轉為字符串
1、直接使用網站證書####
1.導出網站證書
-- chrome瀏覽器方法:(其他瀏覽器請百度)
--訪問 https://kyfw.12306.cn/otn/
按F12
--

-- 詳細信息--復制到文件--下一步
-- 選

--選擇保存位置 填入文件名

--下一步 --完成--確定
2、將導出的證書 放在assets文件夾下,沒有就自己創建一個

//使用 在Application里 HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(new InputStream[]{getAssets().open("srca.cer")}, null, null);
==========
也可以不用證書 直接將證書轉為字符串 ,使用字符串
2、將證書轉為字符串####
兩種方式任選一種 直接使用證書 就不用這一步了
代碼 http://download.csdn.net/download/eryhytkmgfhnghnjfghn/9834086
1.在你的module 下 build.gradule里添加
dependencies { 、、、 compile 'com.zhy:okhttputils:2.6.2' 、、、}
2.新建MyApplication
public class MyApplication extends Application { //獲取12306網站證書,將證書中的內容提取出來,寫成字符串常量 //不會提取內容 請百度 //我的在asli是可以直接看到內容的 private String CER_12306 = "-----BEGIN CERTIFICATE-----\n" + "MIICmjCCAgOgAwIBAgIIbyZr5/jKH6QwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ04xKTAn\n" + "BgNVBAoTIFNpbm9yYWlsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRTUkNBMB4X\n" + "DTA5MDUyNTA2NTYwMFoXDTI5MDUyMDA2NTYwMFowRzELMAkGA1UEBhMCQ04xKTAnBgNVBAoTIFNp\n" + "bm9yYWlsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRTUkNBMIGfMA0GCSqGSIb3\n" + "DQEBAQUAA4GNADCBiQKBgQDMpbNeb34p0GvLkZ6t72/OOba4mX2K/eZRWFfnuk8e5jKDH+9BgCb2\n" + "9bSotqPqTbxXWPxIOz8EjyUO3bfR5pQ8ovNTOlks2rS5BdMhoi4sUjCKi5ELiqtyww/XgY5iFqv6\n" + "D4Pw9QvOUcdRVSbPWo1DwMmH75It6pk/rARIFHEjWwIDAQABo4GOMIGLMB8GA1UdIwQYMBaAFHle\n" + "tne34lKDQ+3HUYhMY4UsAENYMAwGA1UdEwQFMAMBAf8wLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDov\n" + "LzE5Mi4xNjguOS4xNDkvY3JsMS5jcmwwCwYDVR0PBAQDAgH+MB0GA1UdDgQWBBR5XrZ3t+JSg0Pt\n" + "x1GITGOFLABDWDANBgkqhkiG9w0BAQUFAAOBgQDGrAm2U/of1LbOnG2bnnQtgcVaBXiVJF8LKPaV\n" + "23XQ96HU8xfgSZMJS6U00WHAI7zp0q208RSUft9wDq9ee///VOhzR6Tebg9QfyPSohkBrhXQenvQ\n" + "og555S+C3eJAAVeNCTeMS3N/M5hzBRJAoffn3qoYdAO1Q8bTguOi+2849A==\n" + "-----END CERTIFICATE-----"; @Override public void onCreate() { super.onCreate(); // 這就是信任所有證書 **和 一 的區別在這里** //這里 import okio.Buffer; HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(new InputStream[]{new Buffer().writeUtf8(CER_12306).inputStream()},null, null); OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10000L, TimeUnit.MILLISECONDS) .readTimeout(10000L, TimeUnit.MILLISECONDS) .addInterceptor(new LoggerInterceptor("TAG")) .hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }) .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager) .build(); OkHttpUtils.initClient(okHttpClient); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
然后同一的34

代碼 https://github.com/DeadLine837/TestHttps
參考 https://github.com/hongyangAndroid/okhttputils