cyber security, protection, technology

OkHttp 綁定 AWS SSL 憑證

前言

前陣子印尼員工遭遇了手機無法連到 AWS EC2 主機的問題,請對方開啟網頁瀏覽器連自家 API,網址列上出現了驚嘆號,懷疑是自家主機不被該裝置信任,出了一版綁定憑證 (SSL pinning) 的版本,果然順利連到了主機。

延伸問題

EC2 的憑證每年換發一次,若應用程式每年也需要出新憑證的版本,到時肯定會手忙腳亂(很容易忘記),而且會有不相容舊版的狀況發生。

解決方法

AWS 的憑證其實是由根憑證 (Root CA) 產生的,而根憑證使用的年限超過 20 年,只要綁定了根憑證,基本上在產品的生命週期中 (或是職業生涯) 不用再為此擔憂。

根憑證:https://www.amazontrust.com/repository

範例程式

將根憑證 (Root CA) 的 SHA-256 Hash 設定到 OkHttpClient (以 3.0 為例):

val domain = "jarvislin.com"

val certificatePinner = CertificatePinner.Builder()
            .add(domain, "sha256/fbe3018031f9586bcbf41727e417b7d1c45c2f47f93be372a17b96b50757d5a2")
            .add(domain, "sha256/7f4296fc5b6a4e3b35d3c369623e364ab1af381d8fa7121533c9d6c633ea2461")
            .add(domain, "sha256/36abc32656acfc645c61b71613c4bf21c787f5cabbee48348d58597803d7abc9")
             // ......下略
            .build()

val client = OkHttpClient.Builder()
      .certificatePinner(certificatePinner)
      .build() // 用這個 client 串 API

有什麼想法嗎?快來跟大家分享你的看法。