最近公司项目需要,网络协议支持https,之前接触不多,所以这次想总结一下https在android开发中的相关内容
一、https证书
对于https和证书的概念,大家可以自行搜索百度。
证书分两种:
1、花钱向认证机构购买的证书,(我们公司买的证书一个就需要4000元,TMD,还不如多租一台服务器)。服务器如果使用了此类证书的话,那对于移动端来说,直接可以忽略此证书,直接用https访问。与之不同的是ios内置了很多信任的证书,所以他们不需要做任何操作
2、另一种是自己制作的证书,使用此类证书的话是不受信任的,也不需要花钱,所以需要我们在代码中将此类证书设置为信任证书
二、如何忽略证书
1、服务器的哥们如果加上了证书的话,那么你们的网络请求的url将从http:xx改成https:xx,如果你直接也将http改成https的话而什么也不做的话,客户端将直接报错,如图:

意思就是没有找到本地证书,那就开始构建一个SSL来信任所有的证书,忽略证书其实就是如此。
2、新建一个类
public class 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;   } } 通过这个类我们可以获得SSLSocketFactory,这个东西就是用来管理证书和信任证书的
但是有一点需要注意:

然后我们在okhttp中设置SSLSocketFactory,如图:

运行之后,发现还是会报错,如图:

意思是我们的请求证书和服务器的证书不一致,这是因为我们还需要配置一个HostnameVerifier来忽略host验证
三、在SSLSocketClient的类中再加入一个方法:
//获取HostnameVerifier   public static HostnameVerifier getHostnameVerifier() {     HostnameVerifier hostnameVerifier = new HostnameVerifier() {       @Override       public boolean verify(String s, SSLSession sslSession) {         return true;       }     };     return hostnameVerifier;   } 然后再okhttp中配置一下HostnameVerifier:

在运行,可以正常访问了
四、整体配置
copy整个工具类到你的项目中:
/**  * Created by Anonymous on 2017/6/13.  */  public class 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;   } } 然后再okhttp中配置
mHttpClient = new OkHttpClient().newBuilder() .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .writeTimeout(15, TimeUnit.SECONDS) .addInterceptor(new LogInterceptor()) .addInterceptor(new TokenInterceptor()) .sslSocketFactory(SSLSocketClient.getSSLSocketFactory())//配置 .hostnameVerifier(SSLSocketClient.getHostnameVerifier())//配置 .build();
如果你用的是retrofit,在retrofit中配置一下okhttp即可
retrofitAPI = new Retrofit.Builder() .baseUrl(AppConfig.baseUrl) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .client(mHttpClient)//配置okhttp .build() .create(RetrofitAPI.class);
这样你就可以忽略https证书正常访问你的网络了,本人android小白,说的不对了,希望大神能指出,也希望大家多多支持武林网。
新闻热点
疑难解答