1. 程式人生 > >okHttp跳過強制https驗證

okHttp跳過強制https驗證

okHttp是基於client連線的,所有的網路連線https都要遵循幾次握手才能資料相互傳輸,因為https的單向或者雙向加密的,所以要想訪問,就需要ssl證書。

對於想用他爬取一些網路資料以及模擬登陸一些網站的時候,https很大的程度加深了我們專案開發的難度,因為要匹配https。

那麼對於我們並不是要開發我們公司或者自己的客戶端,而是爬取或者登陸別人的網站的時候,我們大多數是不需要https的,大多數提供https的網站,是可以直接拿到網頁原始碼等的,但是在有些網站開啟了強制https驗證的時候,我們如果直接訪問https,就會訪問出錯。

那麼需要我們重寫okhttp提供的sslSocketFactory和hostnameVerifier類來偽造一個證書達到繞過https驗證的方法。

使用如下的方法即可

private static OkHttpClient getUnsafeOkHttpClient() {
        try {
            // Create a trust manager that does not validate certificate chains
            final TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }
 
                        @Override
                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                        }
 
                        @Override
                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[]{};
                        }
                    }
            };
 
            // Install the all-trusting trust manager
            final SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            // Create an ssl socket factory with our all-trusting manager
            final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
 
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory);
            builder.hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
            OkHttpClient okHttpClient = builder.build();
            return okHttpClient;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

呼叫方法為

OkHttpClient client = getUnsafeOkHttpClient();

如果有其他的功能更改,在這個方法裡面修改即可。

這樣方法強制性的https,就可以繞過了