OkHttp之HTTPS

OkHttp盡力去平衡兩個相互競爭的關(guān)注點:

  • Connectivity:盡可能地連接更多地主機缭乘。這個包括運行boringssl最新版本的先進主機和運行OpenSSL老版本的稍微過時的主機沐序。
  • Security:連接的安全性。這個包括使用證書驗證遠程網(wǎng)絡(luò)服務(wù)器和使用強密碼的數(shù)據(jù)交換隱私堕绩。

當涉及到一個到HTTPS服務(wù)器的連接時策幼,OkHttp需要知道提供哪個TLS版本和安全套件。一個客戶端想要最大化連通性會包含廢棄的TLS版本和weak-by-design密碼套件奴紧。一個嚴謹?shù)目蛻舳讼胍畲蠡B通性會限制只能用最新TLS版本和最強的密碼套件掸犬。

特定的安全vs連通性決策通過ConnectionSpec實現(xiàn)用押。OkHttp包含三個內(nèi)置的連接規(guī)格:

  • MODERN_TLS:一個連接先進HTTPS服務(wù)器的安全配置握巢。
  • COMPATIBLE_TLS:一個連接安全但是非current-HTTPS服務(wù)器的安全配置彤路。
  • CLEARTEXT:一個用于http://的URL的不安全配置。

默認沫浆,OkHttp會嘗試MODERN_TLS連接捷枯,如果先進配置失敗,則會回退到COMPATIBLE_TLS連接件缸。

TLS版本和加密套件的規(guī)格可能隨著每個版本改變铜靶。例如,在OkHttp2.2他炊,我們放棄支持SSL3.0作為POODLE攻擊的響應(yīng)。在OkHttp2.3放棄支持RC4.與你的桌面網(wǎng)絡(luò)瀏覽器一樣已艰,保持OkHttp最新是保持安全的最好方式痊末。

你可以使用一個自定義TLS版本和加密套件集構(gòu)建你自己的連接規(guī)格。例如哩掺,這個配置限制了三種德高望重的加密套件凿叠。它的缺陷是需要Android5.0版本以上以及一個類似先進網(wǎng)路服務(wù)器。

ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)  
    .tlsVersions(TlsVersion.TLS_1_2)
    .cipherSuites(
          CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
          CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
          CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
    .build();

OkHttpClient client = new OkHttpClient.Builder() 
    .connectionSpecs(Collections.singletonList(spec))
    .build();

認證綁定

默認嚼吞,OkHttp信任主機平臺的證書頒發(fā)機構(gòu)盒件。這個策略最大化了連通性,但是它也受限制于像2011 DigiNotar attack的證書頒發(fā)機構(gòu)攻擊舱禽。它也假定你的HTTPS服務(wù)器證書也是由證書頒發(fā)機構(gòu)簽署炒刁。

使用CertificatePinner來限制哪些證書和證書頒發(fā)機構(gòu)可以被信任。證書鎖定提升安全性誊稚,但是限制你的服務(wù)器團隊更新他們的TLS證書的能力翔始。如果沒有你的服務(wù)器的TLS管理員的祝福罗心,不要使用證書鎖定!

public CertificatePinning() {
    client = new OkHttpClient.Builder()
        .certificatePinner(new CertificatePinner.Builder()
            .add("publicobject.com", "sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=")
            .build())
        .build();
  }

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("https://publicobject.com/robots.txt")
        .build();

    Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

    for (Certificate certificate : response.handshake().peerCertificates()) {
      System.out.println(CertificatePinner.pin(certificate));
    }
  }

自定義可信任證書機構(gòu)

全部的代碼樣例展示了如果使用你自己的證書頒發(fā)機構(gòu)替換主機的城瞎。跟上面一樣渤闷,如果沒有你的服務(wù)器的TLS管理員的祝福,不要使用證書鎖定脖镀!

private final OkHttpClient client;

  public CustomTrust() {
    SSLContext sslContext = sslContextForTrustedCertificates(trustedCertificatesInputStream());
    client = new OkHttpClient.Builder()
        .sslSocketFactory(sslContext.getSocketFactory())
        .build();
  }

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("https://publicobject.com/helloworld.txt")
        .build();

    Response response = client.newCall(request).execute();
    System.out.println(response.body().string());
  }

  private InputStream trustedCertificatesInputStream() {
    ... // Full source omitted. See sample.
  }

  public SSLContext sslContextForTrustedCertificates(InputStream in) {
    ... // Full source omitted. See sample.
  }

原文鏈接:
https://github.com/square/okhttp/wiki/HTTPS

OkHttp官方文檔系列文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末飒箭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜒灰,更是在濱河造成了極大的恐慌弦蹂,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卷员,死亡現(xiàn)場離奇詭異盈匾,居然都是意外死亡,警方通過查閱死者的電腦和手機毕骡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門削饵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人未巫,你說我怎么就攤上這事窿撬。” “怎么了叙凡?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵劈伴,是天一觀的道長。 經(jīng)常有香客問我握爷,道長跛璧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任新啼,我火速辦了婚禮追城,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘燥撞。我一直安慰自己座柱,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布物舒。 她就那樣靜靜地躺著色洞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冠胯。 梳的紋絲不亂的頭發(fā)上火诸,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音涵叮,去河邊找鬼惭蹂。 笑死伞插,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的盾碗。 我是一名探鬼主播媚污,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼廷雅!你這毒婦竟也來了耗美?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤航缀,失蹤者是張志新(化名)和其女友劉穎商架,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芥玉,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蛇摸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灿巧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赶袄。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抠藕,靈堂內(nèi)的尸體忽然破棺而出饿肺,到底是詐尸還是另有隱情,我是刑警寧澤盾似,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布敬辣,位于F島的核電站,受9級特大地震影響零院,放射性物質(zhì)發(fā)生泄漏溉跃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一告抄、第九天 我趴在偏房一處隱蔽的房頂上張望喊积。 院中可真熱鬧,春花似錦玄妈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至枯饿,卻和暖如春酝锅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奢方。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工搔扁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爸舒,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓稿蹲,卻偏偏與公主長得像扭勉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苛聘,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

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