OkHttp使用https萎庭,忽略證書驗證

https

最近在使用https訪問時遇到證書的問題霜医,在調(diào)試的時候始終會提示證書不可用齿拂,于是查詢了一下,忽略證書的驗證肴敛;

方法一:

1.繼承SSLSocketFactory 署海,重寫里面的方法;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;


public class SSLSocketFactoryImp extends SSLSocketFactory {
    private SSLContext sslContext = SSLContext.getInstance("SSL");
    private TrustManager trustManager = null;


    public SSLContext getSSLContext() {
        return sslContext;
    }

    public X509TrustManager getTrustManager() {
        return (X509TrustManager)trustManager;
    }

    public SSLSocketFactoryImp(KeyStore keyStore) throws NoSuchAlgorithmException, KeyManagementException {
        trustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

            }

            @Override
            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
               //注意這里不能返回null医男,否則會報錯,如下面錯誤[1]
                X509Certificate[] x509Certificates = new X509Certificate[0];
                return x509Certificates;
            }
        };

        sslContext.init(null, new TrustManager[]{trustManager}, null);
    }

    @Override
    public String[] getDefaultCipherSuites() {
        return new String[0];
    }

    @Override
    public String[] getSupportedCipherSuites() {
        return new String[0];
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }

    @Override
    public Socket createSocket(Socket socket, String host, int post, boolean autoClose) throws IOException {
        return sslContext.getSocketFactory().createSocket(socket, host, post, autoClose);
    }

    @Override
    public Socket createSocket(String s, int i) throws IOException, UnknownHostException {
        return null;
    }

    @Override
    public Socket createSocket(String s, int i, InetAddress inetAddress, int i1) throws IOException, UnknownHostException {
        return null;
    }

    @Override
    public Socket createSocket(InetAddress inetAddress, int i) throws IOException {
        return null;
    }

    @Override
    public Socket createSocket(InetAddress inetAddress, int i, InetAddress inetAddress1, int i1) throws IOException {
        return null;
    }
}

2.在相應(yīng)的地方調(diào)用,該方法中忽略了我的其他設(shè)置砸狞,只包含關(guān)于ssl的設(shè)置,不影響正常使用镀梭。

public static OkHttpClient getClient(Interceptor... interceptor) {
        OkHttpClient.Builder builder = null;
        try {
            builder = new OkHttpClient.Builder();
            //ssl verifier
            KeyStore trustStore;
            trustStore = KeyStore.getInstance(KeyStore
                    .getDefaultType());
            trustStore.load(null, null);
            SSLSocketFactoryImp ssl = new SSLSocketFactoryImp(KeyStore.getInstance(KeyStore.getDefaultType()));

            HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            };

            builder.sslSocketFactory(ssl.getSSLContext().getSocketFactory(), ssl.getTrustManager())
            .hostnameVerifier(DO_NOT_VERIFY);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return builder.build();
    }

方法二:

直接利用SSLContext來設(shè)置

X509TrustManager xtm = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                X509Certificate[] x509Certificates = new X509Certificate[0];
                return x509Certificates;
            }
        };

        SSLContext sslContext = null;
        try {
            sslContext = SSLContext.getInstance("SSL");

            sslContext.init(null, new TrustManager[]{xtm}, new SecureRandom());

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
        HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .sslSocketFactory(sslContext.getSocketFactory())
                .hostnameVerifier(DO_NOT_VERIFY)
                .build();

錯誤

上面說到如果

public X509Certificate[] getAcceptedIssuers() {
                X509Certificate[] x509Certificates = new X509Certificate[0];
                return x509Certificates;
            }

返回null刀森,報錯如下:

AndroidRuntime( 9669): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxxx.android/com.xxxxActivity}: java.lang.NullPointerException: Attempt to get length of null array
E/AndroidRuntime( 9669):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2623)
E/AndroidRuntime( 9669):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2687)
E/AndroidRuntime( 9669):        at android.app.ActivityThread.access$800(ActivityThread.java:177)
E/AndroidRuntime( 9669):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1557)
E/AndroidRuntime( 9669):        at android.os.Handler.dispatchMessage(Handler.java:111)
E/AndroidRuntime( 9669):        at android.os.Looper.loop(Looper.java:199)
E/AndroidRuntime( 9669):        at android.app.ActivityThread.main(ActivityThread.java:5755)
E/AndroidRuntime( 9669):        at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 9669):        at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime( 9669):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:982)
E/AndroidRuntime( 9669):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:777)
E/AndroidRuntime( 9669): Caused by: java.lang.NullPointerException: Attempt to get length of null array
E/AndroidRuntime( 9669):        at okhttp3.internal.tls.RealTrustRootIndex.<init>(RealTrustRootIndex.java:31)
E/AndroidRuntime( 9669):        at okhttp3.internal.Platform.trustRootIndex(Platform.java:100)
E/AndroidRuntime( 9669):        at okhttp3.internal.Platform$Android.trustRootIndex(Platform.java:249)
E/AndroidRuntime( 9669):        at okhttp3.OkHttpClient.<init>(OkHttpClient.java:189)
E/AndroidRuntime( 9669):        at okhttp3.OkHttpClient.<init>(OkHttpClient.java:60)
E/AndroidRuntime( 9669):        at okhttp3.OkHttpClient$Builder.build(OkHttpClient.java:718)

以上記錄,如有錯誤报账,還望留言指教研底!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末埠偿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子榜晦,更是在濱河造成了極大的恐慌冠蒋,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乾胶,死亡現(xiàn)場離奇詭異抖剿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)识窿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門斩郎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喻频,你說我怎么就攤上這事孽拷。” “怎么了半抱?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵脓恕,是天一觀的道長。 經(jīng)常有香客問我窿侈,道長炼幔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任史简,我火速辦了婚禮乃秀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘圆兵。我一直安慰自己跺讯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布殉农。 她就那樣靜靜地躺著刀脏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪超凳。 梳的紋絲不亂的頭發(fā)上愈污,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機(jī)與錄音轮傍,去河邊找鬼暂雹。 笑死,一個胖子當(dāng)著我的面吹牛创夜,可吹牛的內(nèi)容都是我干的杭跪。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涧尿!你這毒婦竟也來了桨醋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤现斋,失蹤者是張志新(化名)和其女友劉穎喜最,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庄蹋,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡瞬内,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了限书。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虫蝶。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖倦西,靈堂內(nèi)的尸體忽然破棺而出能真,到底是詐尸還是另有隱情,我是刑警寧澤扰柠,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布粉铐,位于F島的核電站,受9級特大地震影響卤档,放射性物質(zhì)發(fā)生泄漏蝙泼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一劝枣、第九天 我趴在偏房一處隱蔽的房頂上張望汤踏。 院中可真熱鬧,春花似錦舔腾、人聲如沸溪胶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哗脖。三九已至,卻和暖如春采桃,著一層夾襖步出監(jiān)牢的瞬間懒熙,已是汗流浹背丘损。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工普办, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人徘钥。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓衔蹲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舆驶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 新年來第一天上班的頭個任務(wù)就是將以往Http改成Https橱健,沒錯就是后綴多了個s。 不知道小伙伴們可以先了解下沙廉。 ...
    G米閱讀 4,207評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,336評論 25 707
  • 這篇文章是我一邊學(xué)習(xí)證書驗證一邊記錄的內(nèi)容拘荡,稍微整理了下,共扯了三部分內(nèi)容: HTTPS 簡要原理撬陵;數(shù)字證書的內(nèi)容...
    左邊飛來一只狗閱讀 3,311評論 2 5
  • 01 社會進(jìn)步的一個明顯標(biāo)志就是父母養(yǎng)育孩子投入的金錢和精力都會大大增加巨税。70后蟋定、80后初為人父母的應(yīng)該感受非常明...
    風(fēng)叔UncleWind閱讀 301評論 0 0
  • 文/孤鳥差魚 傾國傾城的美貌 換來了國王的寵愛 卻不一定幸福
    孤鳥差魚閱讀 185評論 0 4