Android HTTPS證書驗(yàn)證的簡單方式

1. 背景與需求

近期在做IP切換的HTTPS訪問時(shí),遇到了一些問題:客戶端如何進(jìn)行HTTPS的證書驗(yàn)證塔嬉。
其實(shí)對(duì)于一般的項(xiàng)目基本都是做的單向驗(yàn)證阳惹,即在客戶端證書或者HOST的驗(yàn)證;對(duì)于金融晰筛、銀行相關(guān)的項(xiàng)目才會(huì)使用的雙向驗(yàn)證嫡丙,客戶端與服務(wù)端之間都要對(duì)彼此進(jìn)行驗(yàn)證,以防止中間人進(jìn)行攻擊读第。

2.實(shí)現(xiàn)目標(biāo)

本文記錄的是:客戶端實(shí)現(xiàn)對(duì)HOST的驗(yàn)證曙博,這樣基本滿足一般項(xiàng)目的需求,也不需要客戶端內(nèi)置證書卦方,引起更新時(shí)候的麻煩羊瘩。

3. 實(shí)現(xiàn)過程

  • 實(shí)現(xiàn)SSLSocketFactory ,獲取SSLContext
    我們這里沒有本地的證書,所以都是生成TrustManager 時(shí)都是空實(shí)現(xiàn),如果需要通過內(nèi)置證書來驗(yàn)證可以柴查看下面的鏈接尘吗。
public class SSLSocketFactoryImp extends SSLSocketFactory {
    private SSLContext sslContext = SSLContext.getInstance("TLS");
    private TrustManager trustManager = null;


    public SSLContext getSSLContext() {
        return sslContext;
    }

    public X509TrustManager getTrustManager() {
        return (X509TrustManager)trustManager;
    }

    public SSLSocketFactoryImp(KeyStore keyStore) throws NoSuchAlgorithmException, KeyManagementException {
        trustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

            }

            @Override
            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                X509Certificate[] x509Certificates = new X509Certificate[0];
                return x509Certificates;
            }
        };

        sslContext.init(null, new TrustManager[]{trustManager}, null);
    }

    @Override
    public String[] getDefaultCipherSuites() {
        return new String[0];
    }

    @Override
    public String[] getSupportedCipherSuites() {
        return new String[0];
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }

    @Override
    public Socket createSocket(Socket socket, String host, int post, boolean autoClose) throws IOException {
        return sslContext.getSocketFactory().createSocket(socket, host, post, autoClose);
    }

    @Override
    public Socket createSocket(String s, int i) throws IOException, UnknownHostException {
        return null;
    }

    @Override
    public Socket createSocket(String s, int i, InetAddress inetAddress, int i1) throws IOException, UnknownHostException {
        return null;
    }

    @Override
    public Socket createSocket(InetAddress inetAddress, int i) throws IOException {
        return null;
    }

    @Override
    public Socket createSocket(InetAddress inetAddress, int i, InetAddress inetAddress1, int i1) throws IOException {
        return null;
    }
}
  • 關(guān)鍵步驟:驗(yàn)證HOST
    這里是基于OKHTTP來進(jìn)行的驗(yàn)證操作,主要依靠:HttpsURLConnection.getDefaultHostnameVerifier().verify("你的域名", session)方法來驗(yàn)證域名是否一致
KeyStore trustStore;
trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
SSLSocketFactoryImp ssl = new SSLSocketFactoryImp(KeyStore.getInstance(KeyStore.getDefaultType()));

            HostnameVerifier hostnameVerifier = new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    boolean verify = HttpsURLConnection.getDefaultHostnameVerifier().verify("你的域名", session);
                    return verify;
                }
            };

builder.sslSocketFactory(ssl.getSSLContext().getSocketFactory(), ssl.getTrustManager()).hostnameVerifier
                    (hostnameVerifier);

4.一定要閱讀的文章

上面只是簡單的記錄驗(yàn)證HOST的方式逝她,下面的文章會(huì)讓你收獲更多。
1. 阿里移動(dòng)安全:Android安全開發(fā)之安全使用HTTPS

2. 淺析HTTPS中間人攻擊與證書校驗(yàn)

3. Android官方培訓(xùn)課程 : 使用HTTPS與SSL

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末睬捶,一起剝皮案震驚了整個(gè)濱河市黔宛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌擒贸,老刑警劉巖臀晃,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異介劫,居然都是意外死亡徽惋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門座韵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來险绘,“玉大人,你說我怎么就攤上這事誉碴』鹿祝” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵黔帕,是天一觀的道長代咸。 經(jīng)常有香客問我,道長成黄,這世上最難降的妖魔是什么呐芥? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮奋岁,結(jié)果婚禮上贩耐,老公的妹妹穿的比我還像新娘。我一直安慰自己厦取,他們只是感情好潮太,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虾攻,像睡著了一般铡买。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霎箍,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天奇钞,我揣著相機(jī)與錄音,去河邊找鬼漂坏。 笑死景埃,一個(gè)胖子當(dāng)著我的面吹牛媒至,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谷徙,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼拒啰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了完慧?” 一聲冷哼從身側(cè)響起谋旦,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屈尼,沒想到半個(gè)月后册着,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脾歧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年甲捏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞭执。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摊鸡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚕冬,到底是詐尸還是另有隱情,我是刑警寧澤是辕,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布囤热,位于F島的核電站,受9級(jí)特大地震影響获三,放射性物質(zhì)發(fā)生泄漏旁蔼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一疙教、第九天 我趴在偏房一處隱蔽的房頂上張望棺聊。 院中可真熱鬧,春花似錦贞谓、人聲如沸限佩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祟同。三九已至,卻和暖如春理疙,著一層夾襖步出監(jiān)牢的瞬間晕城,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工窖贤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砖顷,地道東北人贰锁。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像滤蝠,于是被迫代替她去往敵國和親豌熄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理几睛,服務(wù)發(fā)現(xiàn)房轿,斷路器,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,737評(píng)論 25 707
  • 這篇文章是我一邊學(xué)習(xí)證書驗(yàn)證一邊記錄的內(nèi)容所森,稍微整理了下囱持,共扯了三部分內(nèi)容: HTTPS 簡要原理;數(shù)字證書的內(nèi)容...
    左邊飛來一只狗閱讀 3,281評(píng)論 2 5
  • 1.OkHttp源碼解析(一):OKHttp初階2 OkHttp源碼解析(二):OkHttp連接的"前戲"——HT...
    隔壁老李頭閱讀 20,821評(píng)論 24 176
  • “小夏焕济,你真的不去嗎纷妆?小魚明天的飛機(jī),晚上的散伙飯晴弃。以后再見就很難了掩幢。”倩倩在早上出門前把這句話丟給了夏小夏上鞠,...
    受傷的紫羅蘭閱讀 1,227評(píng)論 0 2