https遇到自簽名證書/信任證書


對於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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM