https理論與實踐

Mooooon發表於2017-12-14

說點廢話,我一直覺得APPLE是個非常激進的公司, 從早些的Flash,到現在的http,又比如新的Mac連USB口都不給。公司大到這個量級,已經可以憑一己之力促進先進技術的普及了。

本文內容分為以下三部分

  • HTTPS協議
  • 使用Let's Encrypt在後端部署https服務
  • https在iOS上的正確使用姿勢

Part1 HTTPS協議

普通的HTTP請求,在通訊雙方建立了TCP連線之後,就可以進行了。而HTTPS則不同,在建立TCP連線之後,需要先進行SSL協議的握手過程,然後才是HTTP的通訊。

SSL的握手過程如下圖所示

https理論與實踐

alice想要與bob進行https的通訊,需要以下幾步

  1. alice給出協議版本號、一個客戶端生成的隨機數(Client random),以及客戶端支援的加密方法。
  2. bob確認雙方使用的加密方法,並給出數字證照(包含bob的公鑰)、以及一個伺服器生成的隨機數(Server random)。
  3. alice 確認數字證照(向CA確認)有效,然後生成一個新的隨機數(Premaster secret),並使用數字證照中的公鑰,加密這個隨機數,發給鮑勃。
  4. bob使用自己的私鑰,獲取愛麗絲髮來的隨機數(即Premaster secret)。
  5. alice和bob根據約定的加密方法,使用前面的三個隨機數,生成"對話金鑰"(session key),用來加密接下來的整個對話過程。

上述步驟的最終目的,是為了生成”對話金鑰“,以後的通訊都使用這個金鑰進行對稱加密(一般對稱加解密的速度是比較快的)

那麼看到這裡,就又一個問題出現了。握手階段的資訊保安如何保障?

答案是無法保障。整個握手階段,都是明文的。因此如果有第三方竊聽了通訊,他可以獲得Client random、Server random以及加密後的Premaster secret。只要第三方無法破解Premaster secret的內容,那麼通訊就是安全的。

Part2 使用Let's Encrypt在後端部署https服務

可以參考這篇文章

How To Secure Nginx with Let's Encrypt on Ubuntu 16.04

大致步驟

  1. 安裝certbot客戶端
  2. 配置伺服器允許方案 /.well-known資料夾
  3. sudo letsencrypt certonly -a webroot --webroot-path=/var/www/html -d example.com -d www.example.com 這個命令會生成你需要的證照等檔案
  4. 配置Nginx ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

如果速度很慢多半是python的源被牆了,需要改一下pip配置。

Let's Encrypt大法好,退沃通保平安!

Part3 在iOS上使用自己頒發的HTTPS證照的正確姿勢

在開發環境,也需要進行HTTPS的話,需要對AFN進行兩個設定:允許不合法的證照和不驗證域名

    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:[self host]]];

    manager.securityPolicy.allowInvalidCertificates = YES;
    manager.securityPolicy.validatesDomainName = NO;
複製程式碼

相關文章