(Note) 淺析Https

Thanks

HTTPS理論基礎(chǔ)及其在Android中的最佳實踐
聊聊HTTPS和SSL/TLS協(xié)議

理解HTTPS

HTTPS概述

HTTPS是建立在HTTP的基礎(chǔ)上疙筹,Http是一個網(wǎng)絡(luò)協(xié)議讶请,用于傳輸內(nèi)容魁巩,我們知道HTTP的通信過程大致如下:

8.png

Http基于4層網(wǎng)絡(luò)模型:

    ┌────------────┐┌─┬─┬─-┬─┬─-┬─┬─-┬─┬─-┬─┬─-┐
  │        ││D│F│W│F│H│G│T│I│S│U│ │
  │        ││N│I│H│T│T│O│E│R│M│S│其│
  │第四層涧尿,應(yīng)用層 ││S│N│O│P│T│P│L│C│T│E│ │
  │        ││ │G│I│ │P│H│N│ │P│N│ │
  │        ││ │E│S│ │ │E│E│ │ │E│它│
  │        ││ │R│ │ │ │R│T│ │ │T│ │
  └───────------─┘└─┴─┴─-┴─┴─-┴─┴─-┴─┴─-┴─┴-─┘
  ┌───────-----─┐┌─────────-------┬──--------─────────┐
  │第三層,傳輸層 ││  〖宓TCP   │   】猎ぁUDP    │
  └───────-----─┘└────────-------─┴──────────--------─┘
  ┌───────-----─┐┌───----──┬───---─┬────────-------──┐
  │        ││     │ICMP│          │
  │第二層,網(wǎng)絡(luò)層 ││     └──---──┘          │
  │        ││      ⌒砥稹IP            │
  └────────-----┘└────────────────────-------------─-┘
  ┌────────-----┐┌─────────-------┬──────--------─────┐
  │第一層十偶,網(wǎng)絡(luò)接口││ARP/RARP │    其它     │
  └────────------┘└─────────------┴─────--------──────┘
       TCP/IP四層參考模型

從層級上我們可以發(fā)現(xiàn),應(yīng)用層產(chǎn)生的數(shù)據(jù)园细,直接經(jīng)由傳輸層直接傳輸惦积,存在一個很大的問題,安全性猛频。原本的Http就是傳輸明文的狮崩,數(shù)據(jù)一經(jīng)攔截就很容易被別人盜取信息。那怎么解決呢伦乔?HTTPS的方法是厉亏,對傳輸?shù)臄?shù)據(jù)進(jìn)行加密,在應(yīng)用層和傳輸層的中間加一層烈和,S層: SSL/TLS爱只,Secure Sockets Layer 安全套接層 / Transport Layer Security 傳輸層安全協(xié)議,這一層使用的主要是 SSL/TLS 技術(shù)招刹,這兩個協(xié)議其實就是安全加密算法的不同:

    ┌────------────┐┌─┬─┬─-┬─┬─-┬─┬─-┬─┬─-┬─┬─-┐
  │        ││D│F│W│F│H│G│T│I│S│U│ │
  │        ││N│I│H│T│T│O│E│R│M│S│其│
  │第四層恬试,應(yīng)用層 ││S│N│O│P│T│P│L│C│T│E│ │
  │        ││ │G│I│ │P│H│N│ │P│N│ │
  │        ││ │E│S│ │ │E│E│ │ │E│它│
  │        ││ │R│ │ │ │R│T│ │ │T│ │
  └───────------─┘└─┴─┴─-┴─┴─-┴─┴─-┴─┴─-┴─┴-─┘

              ┌───────-----─┐
            │SSL/TLS     │       
            └───────-----─┘

  ┌───────-----─┐┌─────────-------┬──--------─────────┐
  │第三層窝趣,傳輸層 ││   TCP   │   ⊙挡瘛UDP    │
  └───────-----─┘└────────-------─┴──────────--------─┘
  ┌───────-----─┐┌───----──┬───---─┬────────-------──┐
  │        ││     │ICMP│          │
  │第二層哑舒,網(wǎng)絡(luò)層 ││     └──---──┘          │
  │        ││       IP            │
  └────────-----┘└────────────────────-------------─-┘
  ┌────────-----┐┌─────────-------┬──────--------─────┐
  │第一層幻馁,網(wǎng)絡(luò)接口││ARP/RARP │    其它     │
  └────────------┘└─────────------┴─────--------──────┘
       TCP/IP四層參考模型
對稱加密算法

既然加密洗鸵,那怎么一個規(guī)則呢?加密仗嗦,在我們的理解是這樣的:

9.png

用一個密碼/密鑰膘滨,用某種算法對明文進(jìn)行加密,得到密文稀拐,解密也容易:

10.png

像上面這樣火邓,用同一個密碼/密鑰進(jìn)行加密和解密的,就是對稱加密算法德撬,因為其密碼/密鑰是一樣的铲咨,所以名曰為對稱。但如果HTTPS中使用這種算法的話蜓洪,就需要通信雙方知道密鑰纤勒,這樣就必須在通信的時候,先把密鑰發(fā)給對方蝠咆,但這樣踊东,黑客若截獲這密碼北滥,等于沒用刚操。

非對稱加密算法

“非對稱加密技術(shù)”,意思就是說:“加密”和“解密”使用不同的密鑰再芋。其基本原理菊霜,就是大數(shù)的因式分解。這里就不展開了济赎,密碼學(xué)的東西鉴逞,很神奇。因為有兩個不同的密鑰司训,我們命名為公鑰和私鑰构捡,公鑰是可以對外公開的,私鑰是自己保管的壳猜,用公鑰或私鑰中的任何一個進(jìn)行加密勾徽,用另一個進(jìn)行解密。 加密和解密就變成這樣:

明文 + 加密算法 + 公鑰 => 密文统扳, 
密文 + 解密算法 + 私鑰 => 明文 
11.png

或者是這樣:

明文 + 加密算法 + 私鑰 => 密文喘帚, 
密文 + 解密算法 + 公鑰 => 明文 

總結(jié)來說畅姊,兩個密鑰皆可加密,加密后只有由另一個密鑰解密吹由。

HTTPS中加密算法

非對稱加密很棒若未,但是呢,效率不高倾鲫,速度慢粗合,對稱加密雖然安全性不高,但是效率高啊乌昔。怎么選擇呢舌劳?小孩子才做選擇,大人全都要玫荣。HTTPS結(jié)合了兩種加密算法的優(yōu)勢甚淡,加密解密變成這樣:

13.png

這個過程涉及到四個密鑰:私鑰,公鑰捅厂,對稱加密的Key(這里稱為KeyX)贯卦,公鑰加密KeyX后的KeyY。首先客戶端會得到服務(wù)器發(fā)來的公鑰焙贷,然后撵割,客戶端會隨機生成一個對稱加密用的Key,這里稱為KeyX辙芍,用KeyX對我們要傳輸?shù)拿魑倪M(jìn)行對稱加密啡彬,因為明文可能很多,所以這里用對稱加密故硅,就效率高很多庶灿,得到對稱加密的密文,然后用公鑰對KeyX進(jìn)行非對此加密得到KeyY吃衅,然后一并傳輸密文和KeyY給服務(wù)器往踢。想要解釋密文,就得先得到KeyX徘层,想要得到KeyX峻呕,就得有密鑰,完美趣效。所以只能擁有密鑰的服務(wù)器能得到明文瘦癌。

具體的HTTPS請求實際可細(xì)分為一下步驟:(摘自大神博客)

  1. 客戶端向服務(wù)器發(fā)起HTTPS請求,連接到服務(wù)器的443端口跷敬。
  2. 服務(wù)器端有一個密鑰對讯私,即公鑰和私鑰,是用來進(jìn)行非對稱加密使用的,服務(wù)器端保存著私鑰妄帘,不能將其泄露楞黄,公鑰可以發(fā)送給任何人。
  3. 服務(wù)器將自己的公鑰發(fā)送給客戶端抡驼。
  4. 客戶端收到服務(wù)器端的公鑰之后鬼廓,會對公鑰進(jìn)行檢查,驗證其合法性致盟。如果發(fā)現(xiàn)發(fā)現(xiàn)公鑰有問題碎税,那么HTTPS傳輸就無法繼續(xù)。嚴(yán)格的說馏锡,這里應(yīng)該是驗證服務(wù)器發(fā)送的數(shù)字證書的合法性雷蹂。如果公鑰合格,那么客戶端會生成一個隨機值杯道,這個隨機值就是用于進(jìn)行對稱加密的密鑰匪煌,我們將該密鑰稱之為client key,即客戶端密鑰党巾,這樣在概念上和服務(wù)器端的密鑰容易進(jìn)行區(qū)分萎庭。然后用服務(wù)器的公鑰對客戶端密鑰進(jìn)行非對稱加密,這樣客戶端密鑰就變成密文了齿拂,至此驳规,HTTPS中的第一次HTTP請求結(jié)束。
  5. 客戶端會發(fā)起HTTPS中的第二個HTTP請求署海,將加密之后的客戶端密鑰發(fā)送給服務(wù)器吗购。
  6. 服務(wù)器接收到客戶端發(fā)來的密文之后,會用自己的私鑰對其進(jìn)行非對稱解密砸狞,解密之后的明文就是客戶端密鑰捻勉,然后用客戶端密鑰對數(shù)據(jù)進(jìn)行對稱加密,這樣數(shù)據(jù)就變成了密文趾代。
  7. 然后服務(wù)器將加密后的密文發(fā)送給客戶端贯底。
  8. 客戶端收到服務(wù)器發(fā)送來的密文,用客戶端密鑰對其進(jìn)行對稱解密撒强,得到服務(wù)器發(fā)送的數(shù)據(jù)。這樣HTTPS中的第二個HTTP請求結(jié)束笙什,整個HTTPS傳輸完成飘哨。

數(shù)字證書

我們拿到的公鑰怎么確保真的是服務(wù)器的公鑰呢?黑客有可能中途篡改公鑰琐凭,將其改成黑客自己的芽隆。摘個例子:

假設(shè)一個鎮(zhèn)里面有兩個人A和B,A是個富豪,B想向A借錢胚吁,但是A和B不熟牙躺,怕B借了錢之后不還。這時候B找到了鎮(zhèn)長腕扶,鎮(zhèn)長給B作擔(dān)保孽拷,告訴A說:“B人品不錯,不會欠錢不還的半抱,你就放心借給他吧脓恕。” A聽了這話后窿侈,心里想:“鎮(zhèn)長是全鎮(zhèn)最德高望重的了炼幔,他說B沒問題的話那就沒事了,我就放心了”史简。 于是A相信B的為人乃秀,把錢借給了B。

類似地圆兵,公鑰需要一個擔(dān)保人:證書認(rèn)證中心(Certificate Authority)环形,簡稱CA。CA本身有一對公鑰和私鑰衙傀,CA會用CA自己的私鑰對要進(jìn)行認(rèn)證的公鑰進(jìn)行非對稱加密呢蛤,此處待認(rèn)證的公鑰就相當(dāng)于是明文柑潦,加密完之后,得到的密文再加上證書的過期時間、頒發(fā)給凯肋、頒發(fā)者等信息,就組成了數(shù)字證書粟害。

Android-Retrofit 配置證書 訪問HTTPS

先把轉(zhuǎn)換后的cer文件放到 R.raw.

private SSLContext initCertificates(InputStream... certificates) {
    try {
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keyStore.load(null);
        int index = 0;
        for (InputStream certificate : certificates) {
            String certificateAlias = Integer.toString(index++);
            keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
            try {
                if (certificate != null)
                    certificate.close();
            } catch (IOException ignored) { }
        }
        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);
        sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
        return sslContext;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
public void init(Context context) {
    InputStream inputStream = context.getResources().openRawResource(R.raw.https);
    sslContext = initCertificates(inputStream);
}

調(diào)用:

private HttpsContract getBaseHttpProtocol(SSLContext sslContext, String baseServer) {
    OkHttpClient client=new OkHttpClient.Builder()
            .sslSocketFactory(sslContext.getSocketFactory())
            .hostnameVerifier(new SafeHostnameVerifier())
            .build();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(baseServer)
            .addConverterFactory(ScalarsConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .client(client)
            .build();
    return retrofit.create(HttpsContract.class);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棚瘟,一起剝皮案震驚了整個濱河市现斋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌偎蘸,老刑警劉巖庄蹋,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞬内,死亡現(xiàn)場離奇詭異,居然都是意外死亡限书,警方通過查閱死者的電腦和手機虫蝶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倦西,“玉大人能真,你說我怎么就攤上這事〉飨蓿” “怎么了舟陆?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耻矮。 經(jīng)常有香客問我秦躯,道長,這世上最難降的妖魔是什么裆装? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任踱承,我火速辦了婚禮,結(jié)果婚禮上哨免,老公的妹妹穿的比我還像新娘茎活。我一直安慰自己,他們只是感情好琢唾,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布载荔。 她就那樣靜靜地躺著,像睡著了一般采桃。 火紅的嫁衣襯著肌膚如雪懒熙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天普办,我揣著相機與錄音工扎,去河邊找鬼。 笑死衔蹲,一個胖子當(dāng)著我的面吹牛肢娘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舆驶,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼橱健,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贞远?” 一聲冷哼從身側(cè)響起畴博,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蓝仲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡袱结,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年亮隙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垢夹。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡溢吻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出果元,到底是詐尸還是另有隱情促王,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布而晒,位于F島的核電站蝇狼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏倡怎。R本人自食惡果不足惜迅耘,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望监署。 院中可真熱鬧颤专,春花似錦、人聲如沸钠乏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晓避。三九已至簇捍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間够滑,已是汗流浹背垦写。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留彰触,地道東北人梯投。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像况毅,于是被迫代替她去往敵國和親分蓖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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