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()中就能夠正常返回數據了。

後記

雙向認證的過程其實並不困難。關鍵還是得需要與後臺多溝通與調試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章