解決方式有兩種:
第一種:繞過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的安全性