当前位置: 首页 > news >正文

https遇到自签名证书/信任证书

对于CA机构颁发的证书Okhttp默认支持 可以直接访问
但是对于自定义的证书就不可以了(如:https ://kyfw.12306.cn/otn/), 需要加入Trust
下面分两部分来写,一是信任所有证书,二是信任指定证书,访问自签名的网站

一、信任所有证书

1. 在你的module 下 build.gradule里添加

dependencies {
、、、
compile 'com.zhy:okhttputils:2.6.2'
、、、}

2.新建MyApplication

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 这就是信任所有证书
        HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null,null, null);
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(10000L, TimeUnit.MILLISECONDS)
                    .readTimeout(10000L, TimeUnit.MILLISECONDS)
                    .addInterceptor(new LoggerInterceptor("TAG"))
                    .hostnameVerifier(new HostnameVerifier() {
                        @Override
                        public boolean verify(String hostname, SSLSession session) {
                            return true;
                        }
                    })
                    .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)
                    .build();
            OkHttpUtils.initClient(okHttpClient);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

3.AndroidMainfest.xml

//添加权限
 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

    <application
        //将新建的MyApplication name添加进来
        android:name=".MyApplication"
        .....

4.然后在需要请求网络的地方

public void getHttps(View view) {
        String url = "https://kyfw.12306.cn/otn/";

        OkHttpUtils
                .get()
                .url(url)
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        Log.e("TAG", "onError: " + e.toString());
                    }

                    @Override
                    public void onResponse(String response, int id) {
                        Log.e("TAG", "onResponse: " + response.toString());
                    }
                });
    }

二、自定义的证书 自签名网站

分两种:1.直接使用网站证书;2.将证书转为字符串

1、直接使用网站证书####

1.导出网站证书
-- chrome浏览器方法:(其他浏览器请百度)
--访问 https://kyfw.12306.cn/otn/
按F12
--

 

-- 详细信息--复制到文件--下一步
-- 选
 
 
--下一步
--选择保存位置 填入文件名
 

--下一步 --完成--确定
2、将导出的证书 放在assets文件夹下,没有就自己创建一个
 

//使用  在Application里 
HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(new InputStream[]{getAssets().open("srca.cer")}, null, null);

==========
也可以不用证书 直接将证书转为字符串 ,使用字符串

2、将证书转为字符串####

两种方式任选一种 直接使用证书 就不用这一步了
代码 http://download.csdn.net/download/eryhytkmgfhnghnjfghn/9834086

1.在你的module 下 build.gradule里添加

dependencies {
、、、
compile 'com.zhy:okhttputils:2.6.2'
、、、}

2.新建MyApplication

public class MyApplication extends Application {
          //获取12306网站证书,将证书中的内容提取出来,写成字符串常量
//不会提取内容 请百度
//我的在asli是可以直接看到内容的
            private String CER_12306 = "-----BEGIN CERTIFICATE-----\n" +
            "MIICmjCCAgOgAwIBAgIIbyZr5/jKH6QwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ04xKTAn\n" +
            "BgNVBAoTIFNpbm9yYWlsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRTUkNBMB4X\n" +
            "DTA5MDUyNTA2NTYwMFoXDTI5MDUyMDA2NTYwMFowRzELMAkGA1UEBhMCQ04xKTAnBgNVBAoTIFNp\n" +
            "bm9yYWlsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRTUkNBMIGfMA0GCSqGSIb3\n" +
            "DQEBAQUAA4GNADCBiQKBgQDMpbNeb34p0GvLkZ6t72/OOba4mX2K/eZRWFfnuk8e5jKDH+9BgCb2\n" +
            "9bSotqPqTbxXWPxIOz8EjyUO3bfR5pQ8ovNTOlks2rS5BdMhoi4sUjCKi5ELiqtyww/XgY5iFqv6\n" +
            "D4Pw9QvOUcdRVSbPWo1DwMmH75It6pk/rARIFHEjWwIDAQABo4GOMIGLMB8GA1UdIwQYMBaAFHle\n" +
            "tne34lKDQ+3HUYhMY4UsAENYMAwGA1UdEwQFMAMBAf8wLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDov\n" +
            "LzE5Mi4xNjguOS4xNDkvY3JsMS5jcmwwCwYDVR0PBAQDAgH+MB0GA1UdDgQWBBR5XrZ3t+JSg0Pt\n" +
            "x1GITGOFLABDWDANBgkqhkiG9w0BAQUFAAOBgQDGrAm2U/of1LbOnG2bnnQtgcVaBXiVJF8LKPaV\n" +
            "23XQ96HU8xfgSZMJS6U00WHAI7zp0q208RSUft9wDq9ee///VOhzR6Tebg9QfyPSohkBrhXQenvQ\n" +
            "og555S+C3eJAAVeNCTeMS3N/M5hzBRJAoffn3qoYdAO1Q8bTguOi+2849A==\n" +
            "-----END CERTIFICATE-----";
    @Override
    public void onCreate() {
        super.onCreate();
        // 这就是信任所有证书   **和 一 的区别在这里**
        //这里  import okio.Buffer;   
        HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(new InputStream[]{new Buffer().writeUtf8(CER_12306).inputStream()},null, null);
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(10000L, TimeUnit.MILLISECONDS)
                    .readTimeout(10000L, TimeUnit.MILLISECONDS)
                    .addInterceptor(new LoggerInterceptor("TAG"))
                    .hostnameVerifier(new HostnameVerifier() {
                        @Override
                        public boolean verify(String hostname, SSLSession session) {
                            return true;
                        }
                    })
                    .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)
                    .build();
            OkHttpUtils.initClient(okHttpClient);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

然后同一的34

 

代码 https://github.com/DeadLine837/TestHttps

參考 https://github.com/hongyangAndroid/okhttputils

  

转载于:https://www.cnblogs.com/ganchuanpu/p/9228255.html

相关文章:

  • Spring学习总结(2)——Spring的常用注解
  • 三剑客 Handler、Looper 和 MessageQueue
  • 使用brew安装MySQL
  • Log4j学习总结(1)——快速入门教程
  • CMDB基于配置文件加载插件的范例
  • RabbitMQ学习总结(2)——安装、配置与监控
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • Bean注入
  • HashTable详解
  • 《Fluid Engine Development》 学习笔记3-光滑粒子流体动力学
  • Express 相关整合
  • Set集合学习
  • redis与lua
  • 并发数和TPS的理解
  • java 过滤list的几种方式
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 3.7、@ResponseBody 和 @RestController
  • ECMAScript入门(七)--Module语法
  • gulp 教程
  • js正则,这点儿就够用了
  • js中的正则表达式入门
  • Markdown 语法简单说明
  • nodejs实现webservice问题总结
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python 反序列化安全问题(二)
  • Redis中的lru算法实现
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 力扣(LeetCode)56
  • 扑朔迷离的属性和特性【彻底弄清】
  • 深入浏览器事件循环的本质
  • 试着探索高并发下的系统架构面貌
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 通信类
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​一些不规范的GTID使用场景
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • $jQuery 重写Alert样式方法
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (11)MATLAB PCA+SVM 人脸识别
  • (52)只出现一次的数字III
  • (C语言)逆序输出字符串
  • (差分)胡桃爱原石
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (转)jQuery 基础
  • (转)Sublime Text3配置Lua运行环境
  • (转)负载均衡,回话保持,cookie
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net 中viewstate的原理和使用
  • .Net中ListT 泛型转成DataTable、DataSet
  • .pyc文件是什么?