okHttp跳過強制https驗證
阿新 • • 發佈:2019-02-07
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,就可以繞過了