Okhttp-wiki 之 HTTPS

OkHttp attempts to balance two competing concerns:

  • Connectivity to as many hosts as possible. That includes advanced hosts that run the latest versions of boringssl and less out of date hosts running older versions of OpenSSL.
  • Security of the connection. This includes verification of the remote webserver with certificates and the privacy of data exchanged with strong ciphers.

OkHttp試圖平衡下面兩者之間的矛盾關(guān)系:

  • 盡可能多的主機連接.這包括運行最新版本先進的boringssl主機和運行舊版本過時的OpenSSL主機.
  • 連接安全.這包括遠程網(wǎng)絡(luò)服務(wù)器證書的驗證和用很強的密碼交換數(shù)據(jù)的隱私.

When negotiating a connection to an HTTPS server, OkHttp needs to know which TLS versions and cipher suites to offer. A client that wants to maximize connectivity would include obsolete TLS versions and weak-by-design cipher suites. A strict client that wants to maximize security would be limited to only the latest TLS version and strongest cipher suites.

當(dāng)判斷一個連接到HTTPS服務(wù)器的連接,OkHttp需要知道是哪個TLS版本和提供的密碼組合.客戶端想要最大化連接將包括過時的TLS版本和很弱的密碼套件.一個嚴(yán)謹(jǐn)?shù)目蛻粝M畲蠡踩珜H限于最新的TLS版本和最強的密碼組合.

Specific security vs. connectivity decisions are implemented by ConnectionSpec. OkHttp includes three built-in connection specs:

  • MODERN_TLS is a secure configuration that connects to modern HTTPS servers.
  • COMPATIBLE_TLS is a secure configuration that connects to secure–but not current–HTTPS servers.
  • CLEARTEXT is an insecure configuration that is used for http:// URLs.

特定的安全與決定連接是由ConnectionSpec實現(xiàn).OkHttp包含三個內(nèi)置的連接標(biāo)準(zhǔn):

  • MODERN_TLS 是一個安全的配置,連接到現(xiàn)有服務(wù)器.
  • COMPATIBLE_TLS 是一個安全的配置,連接到安全的但不是現(xiàn)有服務(wù)器.
  • CLEARTEXT 是一個不安全的配置, 用于 http:// 的URLs.

By default, OkHttp will attempt a MODERN_TLS connection, and fall back to COMPATIBLE_TLS connection if the modern configuration fails.

默認(rèn)情況下,OkHttp將嘗試 MODERN_TLS 連接,如果現(xiàn)有配置失敗則回退至 COMPATIBLE_TLS 連接.

The TLS versions and cipher suites in each spec can change with each release. For example, in OkHttp 2.2 we dropped support for SSL 3.0 in response to the POODLE attack. And in OkHttp 2.3 we dropped support for RC4. As with your desktop web browser, staying up-to-date with OkHttp is the best way to stay secure.

TLS版本和密碼組合在每個規(guī)格下可以改變每個版本.例如,OkHttp 2.2我們?yōu)?POODLE 攻擊向下兼容支持SSL3.0;我們在OkHttp 2.3向下兼容支持 RC4.與桌面瀏覽器相同,保持安全最好的辦法是保持OkHttp是最新的.

You can build your own connection spec with a custom set of TLS versions and cipher suites. For example, this configuration is limited to three highly-regarded cipher suites. Its drawback is that it requires Android 5.0+ and a similarly current webserver.

你也可以建立自己的連接規(guī)范帶有一套定制的TLS版本和密碼套件.例如,這個配置僅限于三個主要的密碼組合.它的缺點是它需要Android 5.0+和相似的現(xiàn)有網(wǎng)絡(luò)服務(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();

Certificate Pinning 證書鎖定

By default, OkHttp trusts the certificate authorities of the host platform. This strategy maximizes connectivity, but it is subject to certificate authority attacks such as the 2011 DigiNotar attack. It also assumes your HTTPS servers’ certificates are signed by a certificate authority.

默認(rèn)情況下,OkHttp信任主機平臺的認(rèn)證中心.這一策略最大化連接,但受制于2011 DigiNotar attack等認(rèn)證授權(quán)攻擊.它還假定HTTPS服務(wù)器的證書已經(jīng)被認(rèn)證中心簽約.

Use CertificatePinner to constrain which certificate authorities are trusted. Certificate pinning increases security, but limits your server team’s abilities to update their TLS certificates. Do not use certificate pinning without the blessing of your server’s TLS administrator!

使用 CertificatePinner 約束所信任的認(rèn)證中心.證書鎖定將增加安全性,但受制于服務(wù)器團隊的能力來更新他們的TLS證書.不要在沒有通知使用你的服務(wù)器的TLS管理員的情況下使用證書鎖定!

  public CertificatePinning() {
    client = new OkHttpClient.Builder()
        .certificatePinner(new CertificatePinner.Builder()
            .add("publicobject.com", "sha1/DmxUShsZuNiqPQsX2Oi9uv2sCnw=")
            .add("publicobject.com", "sha1/SXxoaOSEzPC6BgGmxAt/EAcsajw=")
            .add("publicobject.com", "sha1/blhOM3W9V/bVQhsWAcLYwPU6n24=")
            .add("publicobject.com", "sha1/T5x9IXmcrQ7YuQxXnxoCmeeQ84c=")
            .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));
    }
  }

Customizing Trusted Certificates 定制被信任的證書

The full code sample shows how to replace the host platform’s certificate authorities with your own set. As above, do not use custom certificates without the blessing of your server’s TLS administrator!

完整的代碼示例展示了如何用你自己的設(shè)置替換主機平臺的認(rèn)證中心.不要在沒有通知使用你的服務(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.
        // 詳細代碼請看官方sample,點擊標(biāo)題鏈接進入
  }

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

對OkHttp感興趣的朋友可以看一看Okhttp-wiki系列,可以幫助你理解Okhttp的使用方法及原理:

  1. Okhttp-wiki 之 Home 主頁
  2. Okhttp-wiki 之 Calls 調(diào)用
  3. Okhttp-wiki 之 Connections 連接
  4. Okhttp-wiki 之 Recipes 秘訣(食譜)
  5. Okhttp-wiki 之 Interceptors 攔截器
  6. Okhttp-wiki 之 HTTPS
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市汛兜,隨后出現(xiàn)的幾起案子通今,更是在濱河造成了極大的恐慌,老刑警劉巖漏策,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臼氨,死亡現(xiàn)場離奇詭異,居然都是意外死亡感耙,警方通過查閱死者的電腦和手機持隧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門屡拨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呀狼,你說我怎么就攤上這事〗信郑” “怎么了她奥?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绷跑。 經(jīng)常有香客問我凡资,道長谬运,這世上最難降的妖魔是什么垦藏? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮轰驳,結(jié)果婚禮上弟灼,老公的妹妹穿的比我還像新娘。我一直安慰自己勤哗,他們只是感情好掩驱,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腊状,像睡著了一般苔可。 火紅的嫁衣襯著肌膚如雪袋狞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天同蜻,我揣著相機與錄音早处,去河邊找鬼。 笑死砌梆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桃序。 我是一名探鬼主播烂瘫,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芦鳍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起间影,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茄茁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后付燥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愈犹,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年勋颖,在試婚紗的時候發(fā)現(xiàn)自己被綠了勋锤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡茄厘,死狀恐怖谈宛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窑滞,我是刑警寧澤恢筝,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站聊训,受9級特大地震影響恢氯,放射性物質(zhì)發(fā)生泄漏鼓寺。R本人自食惡果不足惜勋磕,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苦银。 院中可真熱鬧,春花似錦幔虏、人聲如沸贝椿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渣窜。三九已至,卻和暖如春乔宿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背囤官。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工蛤虐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肝陪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓饲常,卻偏偏與公主長得像狼讨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子政供,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

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

  • HTTPS OkHttp attempts to balance two competing concerns: ...
    雪晨杰閱讀 1,470評論 0 0
  • Although you provide only the URL, OkHttp plans its conne...
    漢之風(fēng)云閱讀 3,207評論 0 49
  • OkHttp 試圖平衡兩種競爭的擔(dān)憂: Connectivity連接到盡可能多的主機巍佑。包括運行最新版本boring...
    談小龍閱讀 3,907評論 0 2
  • 《三字經(jīng)》曰:“養(yǎng)不教招刨、父之過,教不嚴(yán)沉眶、師之惰。子不學(xué)学密、非所宜,幼不學(xué)腻暮、老何為毯侦?” 度此言,吾覺非也侈离。我的觀點是:...
    楊志剛_785e閱讀 476評論 0 2
  • 致情人(平水韻) 文/賀承德 情人掬美花卦碾,春樹夢新芽。 愛溢心尖上洲胖,容顏燦若霞。 作者簡介绿映;賀承德,山東棗莊人丐一,中...
    賀承德閱讀 446評論 3 1