Android HTTPS 与后台服务端的双向验证

前言

前段时间在做项目,有点杯具的是公司目前在做新产品,Android客户端、后台服务端、Web端前台都得从新做。甚至连API都得从新根据需求来定。其实吧,这种情况有好有坏啦!好处就是能够从零开始去了解一遍整体的软件框架,考虑的事情也比较多也比较全面,对自己专业技能方面还是有很大程度提升的。而坏处就是开发时间比较长,前期需求评审会议各种开各种讨论,前期麻烦得要死,费时费力!其中就我一个人负责Android端开发,没错,一个人.....o(╥﹏╥)o 独立开发前期得定需求,定接口,定框架,定方案;接着又是一堆评审会议,心力憔悴。这时候会有人会问了:这些不都是项目经理的工作吗?哎,毕竟不是在一线大公司啊,没有这么多人力参与,自己负责的模块自己出方案然后集思广益开评审会,于是只能默默的接过了本该是项目经理做的活。

经过一段时间的需求阶段,终于来到开发阶段了。编码阶段也是出现了很多问题。今天时间有限,只能一个个来说了。以后有时间再更新吧!今天说的是 Android HTTPS 与后台服务端的双向验证

注意:只针对Android端,要是希望看后台配置的恐怕要失望了,可以不用往下看了。

 

目的与原理

首先说一下 HTTPS 双向验证的目的,仅限个人理解,而且个人不喜欢说那些专业术语,显得很专业但是又没有人能看懂,装X给谁看?再说我又不是大神,没这么多包袱,怎么通俗怎么来,哈哈哈额....

举个例子--户口本。每家都有一个户口本。并且户口本上都有每个家人的个人信息。那么如何证明你是这户人家的“家人”呢?只要查看户口本上面的个人信息页当中有你的信息,并且你个人信息和你自己的身份证对得上就可以了。从这个简单的例子当中可以看出什么呢?我们可以具体分析下:

证明:如何证明你是这户人家的家人?

步骤一:本人将个人信息(身份证号码、姓名、年龄、住址等)给到户口本做验证

步骤二:户口本校验个人信息,确定个人信息正确无误,户口本证明此人是“家人”,于是户口本又将个人信息给到个人验证

步骤三:个人拿到户口本给的个人信息后再次与自己的个人信息进行二次确认。确认无误后证明本人是这户人家的“家人”。

如今我们回到双向验证的问题上。其实户口本就相当于后台服务端,家里的每个人都可以看成是一个客户端。服务端拥有每一个客户端的信息秘钥,就好比每个人的身份证号码、姓名等。当客户端想要与服务端建立联系,就需要以上“证明是家人”的过程。服务端要客户端的秘钥来证明你是我的“家人”,客户端要户口本的秘钥来证明我是你的家庭成员。双向认证就是这么一个双方确认关系的过程。

 

Android 客户端实现

开始准备工作:

要实现双向认证。首先需要服务端给你提供证书。一般是后台工程师提供给你。后缀名为.bks的文件。证书有两份,一份是客户端认证过的证书,一份是服务端的证书。缺一不可。

拿到证书后将证书放到android 工程的assets文件夹中。小编这里as-clients.bks是客户端证书,server.bks是服务端证书

接着是访问服务端建立连接。小编android 目前采用Retrofit+Rxjava2 进行网络访问。

所以我们需要先读取证书数据来进行封装。

我们将证书数据封装到OkHttpClient中并传递到M层。

 

M层封装Retrofit,直接访问即可。

//关键代码
@Override
public void GetModelData(ImodelCallBack imodelCallBack) {


    JSONObject json = new JSONObject();
    try {
        json.put("userName","admin");
        json.put("password","123456");
    } catch (JSONException e) {
        e.printStackTrace();
    }

    RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json.toString());
    //初始化
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Constant.SERVICE_URL_CA) //服务端地址
            .client(mOkhttpClient)//封装的client
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
    LoginServiceApi loginServiceApi = retrofit.create(LoginServiceApi.class);
    loginServiceApi.Login(body).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<LoginBean>() {
                @Override
                public void onCompleted() {
                    //Logger.d("onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    Logger.d(e.getMessage());
                }

                @Override
                public void onNext(LoginBean loginBean) {
                    Logger.d(loginBean.getData().getAccountToken());
                    loginBeans = loginBean;
                }
            });
}
//关键代码

附上自定义的LoginServiceApi接口

 

自此代码就贴完了。如果访问成功,onNext()中就能够正常返回数据了。

后记

双向认证的过程其实并不困难。关键还是得需要与后台多沟通与调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值