【Android】OkHttp實作憑證綁定的方法

OkHttp with certificate pinning.

Posted by Tabaco on October 12, 2018

APP憑證綁定

什麼是憑證綁定(Certificate Pinning)?簡單的來說,憑證綁定是防止攻擊者使用假憑證進行中間人攻擊的一種安全機制。換言之,若未確實做到憑證綁定,則有心人士便可利用假憑證嗅探傳輸中的加密內容,以MITM(Man-in-the-middle)手法攔截敏感資訊。

參考資料:

OkHttp憑證榜定

之前有介紹過HttpsUrlConnection憑證榜定的方式,有興趣的話可以到參考:HttpsURLConnection實作憑證綁定的方法

這裡將介紹如何實作OkHttp憑證榜定,詳細的程式碼可以參考SSLPinningOkHttp 先建立CertificatePinner的實例,再新增憑證參數即可。

CertificatePinner certPinner = new CertificatePinner.Builder()
    .add("github.com",
        "sha256/pL1+qb9HTMRZJmuC/bB/ZI9d302BYrrqiVuRyW+DGrU=")
    .add("github.com",
        "sha256/RRM1dGqnDFsCJXBTHky16vi1obOlCgFFn/yOhI/y+ho=")
    .build();

接著將CertificatePinner的實例加入OkHttpClient內,之後如果可以正常連線代表已經有憑證榜定了。

private String connect(String url) throws IOException {
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .certificatePinner(mCertPinner)
        .build();

    Request request = new Request.Builder()
                .url(url)
                .build();

    Response response = okHttpClient.newCall(request).execute();

    if(response.isSuccessful())
        return "ok";
    return null;
}

是不是比HttpsUrlConnection簡單多了。