retrofit遇上https自签名证书

最近来了家新公司,后台设计在非线上环境用自签名证书,线上环境用CA证书,然后发了份.cer公钥给我.让我在客户端处理一下.我查了很多博客,只言片语的, HTTPS的流程也比较长, 今天调试好了,贴出连续的代码给大家看一下.https有2种情况 单向验证和双向验证 单向认证:客户端通过直接读取后台给的公钥验证握手 比如直接读取cer文件或者直接把公钥写在代码里. 双向认证:客户的有公
摘要由CSDN通过智能技术生成

最近来了家新公司,后台设计在非线上环境用自签名证书,线上环境用CA证书,然后发了份.cer公钥给我.让我在客户端处理一下.

我查了很多博客,只言片语的,
HTTPS的流程也比较长,
今天调试好了,贴出连续的代码给大家看一下.

https有2种情况 单向验证双向验证
单向认证:客户端通过直接读取后台给的公钥验证握手
比如直接读取cer文件或者直接把公钥写在代码里.
双向认证:客户的有公钥,后台也有公钥,互相存储对方的公钥,验证网络通讯,
这个时候Android端要生成bks.

有很多博客一上来就生成bks,一定要知道什么场景.


而我现在讨论单向验证,
基于鸿洋大神的这篇做代码补充:
Android Https相关完全解析 当OkHttp遇到Https

单向验证方法一:简单粗暴,直接信任所有.

在MainActicity.java中: 有个网络请求:loadData()方法

public void loadData() {
        SSLSocketFactoryUtils.MyX509TrustManager myX509TrustManager= new SSLSocketFactoryUtils.MyX509TrustManager();
        OkHttpClient okhttpclient=new OkHttpClient.Builder()
               .sslSocketFactory(SSLSocketFactoryUtils.createSSLSocketFactory(), SSLSocketFactoryUtils.createTrustAllManager())
                .hostnameVerifier(new SSLSocketFactoryUtils.TrustAllHostnameVerifier())
                .build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://gw.dev.cmrh.com:8888/RH_MAS/")
                .client(okhttpclient)
       .addConverterFactory(
               new Converter.Factory(){
                   public @Nullable Converter<ResponseBody, ?> responseBodyConverter(Type type,
                                                                                     Annotation[] annotations, Retrofit retrofit) {
                       return new Converter<ResponseBody, Object>() {
                           @Override
                           public Object convert(ResponseBody value) throws IOException {
                               return value.string();
                           }
                       };
                   }
               })
                .build();

        GitHubService service = retrofit.create(GitHubService.class);

        Call<String> call = service.listRepos();
        call.enqueue(MainActivity.this);

    }

    @Override
    public void onResponse(Call<String> call, Response<String> response) {
        Log.d("body-onResponse",response.body()+";;;;;;");
    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {

        t.printStackTrace();
        Log.d("body-onFailure",call.request().url()+"============");
    }

关键的就是OkHttpClient里的 sslSocketFactoryhostnameVerifier设置
然后就是 Retrofit.client(okhttpclient)使用我们自己设置的client.

SSLSocketFactoryUtils.java的实现内容:

public class SSLSocketFactoryUtils {
   
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值