okhttp訪問https的問題

解決方式有兩種:

第一種:繞過https的驗證方法:

1.1新建一個SSLSocketClient工具類,添加如下方法:

```

//獲取這個SSLSocketFactory

public static SSLSocketFactory getSSLSocketFactory()?{

??? try {

??????? SSLContext sslContext = SSLContext.getInstance("SSL");

??????? sslContext.init(null, getTrustManager(), new SecureRandom());

??????? return sslContext.getSocketFactory();

????} catch (Exception e)?{

??????? throw new RuntimeException(e);

????}

}

//獲取TrustManager

private static TrustManager[] getTrustManager()?{

??? TrustManager[] trustAllCerts = new TrustManager[]{

??????????? new X509TrustManager()?{

????????????????@Override

??????????????? public void checkClientTrusted(X509Certificate[] chain, String authType)?{

????????????????}

????????????????@Override

??????????????? public void checkServerTrusted(X509Certificate[] chain, String authType)?{

????????????????}

????????????????@Override

??????????????? public X509Certificate[] getAcceptedIssuers()?{

??????????????????? return new X509Certificate[]{};

????????????????}

????????????}

????};

??? return trustAllCerts;

}

//獲取HostnameVerifier

public static HostnameVerifier getHostnameVerifier()?{

??? HostnameVerifier hostnameVerifier = new HostnameVerifier()?{

????????@Override

??????? public boolean verify(String s, SSLSession sslSession)?{

??????????? return true;

????????}

????};

??? return hostnameVerifier;

}

```

1.2然后okhttp添加配置

```

clone = OkHttpUtils.getInstance().getOkHttpClient().newBuilder()

????????.readTimeout(readTimeOut, TimeUnit.MILLISECONDS)

????????.writeTimeout(writeTimeOut, TimeUnit.MILLISECONDS)

????????.connectTimeout(connTimeOut, TimeUnit.MILLISECONDS)

????????.sslSocketFactory(SSLSocketClient.getSSLSocketFactory())

????????.hostnameVerifier(SSLSocketClient.getHostnameVerifier())

????????.build();

call = clone.newCall(request);

```

這種方式是繞過了驗證,所以說使用https請求就沒什么意義了

第二種方式:

2.1通過讀取后臺提供的證書文件

首先把證書放到assets文件夾中

然后在SSLSocketClient工具類中添加如下方法:

```

//獲取這個SSLSocketFactory

public static SSLSocketFactory getSSlSocketFactory(InputStream certificates)?{

??? SSLContext sslContext = null;

??? try {

??????? CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");

??????? Certificate ca;

??????? try {

??????????? ca = certificateFactory.generateCertificate(certificates);

????????} finally {

??????????? certificates.close();

????????}

????????// Create a KeyStore containing our trusted CAs

??????? String keyStoreType = KeyStore.getDefaultType();

??????? KeyStore keyStore = KeyStore.getInstance(keyStoreType);

??????? keyStore.load(null, null);

??????? keyStore.setCertificateEntry("ca", ca);

????????// Create a TrustManager that trusts the CAs in our KeyStore

??????? String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();

??????? TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);

??????? tmf.init(keyStore);

????????// Create an SSLContext that uses our TrustManager

??????? sslContext = SSLContext.getInstance("SSL");

??????? sslContext.init(null, tmf.getTrustManagers(), null);

????} catch (Exception e)?{

??????? e.printStackTrace();

????}

??? return sslContext != null ? sslContext.getSocketFactory()?: null;

}

//讀取證書文件

public static InputStream getInputStream(){

??? InputStream inputStream = null;

??? try {

??????? inputStream = MyApplicaton.getContext().getAssets().open("cert.pem");

????} catch (IOException e)?{

??????? e.printStackTrace();

????}

??? return inputStream;

}

```

2.2然后對okhttp進行配置:

```

clone = OkHttpUtils.getInstance().getOkHttpClient().newBuilder()

????????.readTimeout(readTimeOut, TimeUnit.MILLISECONDS)

????????.writeTimeout(writeTimeOut, TimeUnit.MILLISECONDS)

????????.connectTimeout(connTimeOut, TimeUnit.MILLISECONDS)

????????.sslSocketFactory(SSLSocketClient.getSSlSocketFactory(SSLSocketClient.getInputStream()))

????????.hostnameVerifier(SSLSocketClient.getHostnameVerifier())

????????.build();

call = clone.newCall(request);

```

這種方式就保證了https的安全性

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容