android 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

时间: 2024-08-23 17:21:12

android https遇到自签名证书/信任证书的相关文章

为你的android App实现自签名的ssl证书(https)

不愿意看啰嗦的可以直接去          实现步骤 最近公司项目用到https的接口形式,对于一般的网络请求 我们用的是http://******      使用的是 代码用来打开一个 http 连接. URL urlConnection = new URL("http://www.codeproject.com/"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 不要在 ht

Android Https双向认证 + GRPC

keywords:android https 双向认证android GRPC https 双向认证 ManagedChannel channel = OkHttpChannelBuilder.forAddress("xxx",yyy) .overrideAuthority("zzz") .sslSocketFactory(sslFactory) .build(); 1.千万不要像官网案例那样设置setPlaintext(true),这个是设置明文,我们用的是密文

https本地自签名证书添加到信任证书访问

1.背景 本文适用于基于https(http+ssl)的网站通信.本地调试等,上线是请寻找免费 ssl证书申请. 本地调试过程中,一些特殊的场景需要我使用http+ssl通信,比如在Chrome中使用客户端麦克风. 笔者起初使用以下一些命令,在linux.windows进行自签名,但是没能得到Chrome的信任,本地Chrome版本76.0 1. 使用openssl生成密钥privkey.pem: openssl genrsa -out D:\develop\nginx-1.14.2\conf\

HTTPS 信任证书

使用HttpsURLConnection访问HTTPS链接时一般需要引入证书,否则会产生异常. 但是也可以使用信任所有证书的方式来达到访问的目的. 经上网查询资料发现一个很好用的类来实现信任所有证书的功能.特此记录. 代码来自[这里](http://javaweb.org/?p=1237) 类代码 import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import ja

Https系列之一:https的简单介绍及SSL证书的生成

Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http.https,基于spring boot四:https的SSL证书在Android端基于okhttp,Retrofit的使用 所有文章会优先在:微信公众号"颜家大少"中发布转载请标明出处 一:本文的主要内容介绍 https的介绍SSL证书的介绍自签名SSL证书介绍及生成方法CA证书介绍及申

Android安全加密:数字签名和数字证书

Android安全加密专题文章索引 Android安全加密:对称加密 Android安全加密:非对称加密 Android安全加密:消息摘要Message Digest Android安全加密:数字签名和数字证书 Android安全加密:Https编程 以上学习所有内容,对称加密.非对称加密.消息摘要.数字签名等知识都是为了理解数字证书工作原理而作为一个预备知识.数字证书是密码学里的终极武器,是人类几千年历史总结的智慧的结晶,只有在明白了数字证书工作原理后,才能理解Https 协议的安全通讯机制.

给Nginx配置一个自签名的SSL证书

要保证Web浏览器到服务器的安全连接,HTTPS几乎是唯一选择.HTTPS其实就是HTTP over SSL,也就是让HTTP连接建立在SSL安全连接之上. SSL使用证书来创建安全连接.有两种验证模式: 仅客户端验证服务器的证书,客户端自己不提供证书: 客户端和服务器都互相验证对方的证书. 显然第二种方式安全性更高,一般用网上银行会这么搞,但是,普通的Web网站只能采用第一种方式. 客户端如何验证服务器的证书呢?服务器自己的证书必须经过某“权威”证书的签名,而这个“权威”证书又可能经过更权威的

HTTPS加密通信原理及数字证书系统

https加密通信原理: 公钥私钥成对,公钥公之于众,私钥只有自己知道. 用公钥加密的信息只能由与之相对应的私钥解密. 甲给乙发送数据时,甲先用乙的公钥加密这段数据,再用自己的私钥对这段数据的特征数据(数字指纹,通过HASH函数生成)进行RSA运算形成签名.乙接到数据后,先用自己的私钥解密数据,并用甲的公钥对甲的签名进行验证(解出数字指纹,与接收到的数据的数字指纹做对比).如此,可保证发信人无法抵赖曾发过该信息,也确保报文在传递过程中不会被篡改. CA证书: CA证书是指CA颁发给用户的证书,其

[转]如何创建一个自签名的SSL证书(X509)

原文出自:http://www.joyios.com/?p=47 引言 使用HTTP(超文本传输)协议访问互联网上的数据是没有经过加密的.也就是说,任何人都可以通过适当的工具拦截或者监听到在网络上传输的数据流.但是有时候,我们需要在网络上传输一些安全性或者私秘性的数据,譬如:包含信用卡及商品信息的电子订单.这个时候,如果仍然使用HTTP协议,势必会面临非常大的风险!相信没有人能接受自己的信用卡号在互联网上裸奔. HTTPS(超文本传输安全)协议无疑可以有效的解决这一问题.所谓HTTPS,其实就是