• okhttp 忽略证书


    一、https证书

    对于https和证书的概念,大家可以自行搜索百度。
    证书分两种:
    1、花钱向认证机构购买的证书,(我们公司买的证书一个就需要4000元,TMD,还不如多租一台服务器)。
    服务器如果使用了此类证书的话,那对于移动端来说,直接可以忽略此证书,直接用https访问。与之不同的是ios内置了很多信任的证书,所以他们不需要做任何操作
    2、另一种是自己制作的证书,使用此类证书的话是不受信任的,也不需要花钱,所以需要我们在代码中将此类证书设置为信任证书

    二、如何忽略证书

    1、服务器的哥们如果加上了证书的话,那么你们的网络请求的url将从http:xx改成https:xx,如果你直接也将http改成https的话而什么也不做的话,客户端将直接报错,如图:

    意思就是没有找到本地证书,那就开始构建一个SSL来信任所有的证书,忽略证书其实就是如此。

    三解决办法

    第一步,先创建SSLSocketClient 工具类

        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() {
                return 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[]{};
                            }
                        }
                };
            }
         
            //获取HostnameVerifier
            public static HostnameVerifier getHostnameVerifier() {
                return (s, sslSession) -> true;
            }
         
            public static X509TrustManager getX509TrustManager() {
                X509TrustManager trustManager = null;
                try {
                    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                    trustManagerFactory.init((KeyStore) null);
                    TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
                    if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
                        throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
                    }
                    trustManager = (X509TrustManager) trustManagers[0];
                } catch (Exception e) {
                    e.printStackTrace();
                }
         
                return trustManager;
            }
        }
    

    第二步,调用示例:

     final OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
    //            .sslSocketFactory(SSLSocketClient.getSSLSocketFactory())
                .sslSocketFactory(SSLSocketClient.getSSLSocketFactory(), SSLSocketClient.getX509TrustManager())
                .hostnameVerifier(SSLSocketClient.getHostnameVerifier())
                .build();
    
  • 相关阅读:
    (4.15)存储DAS,NAS,SAN在数据库存储上的应用
    (4.14)存储:RAID在数据库存储上的应用
    关于like %%的优化思路
    (4.13)SQL Server profile使用、数据库优化引擎顾问使用
    图形界面执行计划图标释义
    (4.15)全文索引的使用
    倒排索引/全文搜索基本原理
    SQLServer: 用 ApexSQLLog 恢复 SQL Server 数据
    (4.12)2012及以上列存储索引
    教你管理SQL实例系列(1-15)
  • 原文地址:https://www.cnblogs.com/xidianzxm/p/14310104.html
Copyright © 2020-2023  润新知