2017年10月23日 星期一

免費且快速地搞定 HTTPS 環境 (非自簽憑證)

遊戲營運後端免不了要跟 Web API 打交道。呼叫第三方的 Web API 是最常見的,另有少數場合必需提供簡易的 Web API 接口讓第三方查詢營運數據、或是使用第三方服務必需提供的 Webhook等等。這幾年,尤其是在 Apple 帶頭打壓  iOS 裝置上的 HTTP 的使用後,感覺要求全面以 HTTPS 來溝通的第三方服務日漸增多。其中不乏也有跟 Apple 一樣,完全不接受「自簽署 (Self-Signed) 憑證」的情況。如果對於 URL 中的域名長相並不在意 (例如說只是要提供 Webhook),這裡倒是可以分享一下怎麼快速的搞定這類需求。



要準備非自簽憑證的 HTTPS 環境,關鍵是要準備好以下幾個項目:

  1. 域名 Domain Name
  2. SSL 憑證
  3. Web 伺服器
有了前兩項之後,最後的 Web 伺服器準備其實不太需要贅述的。因此本篇把重點放在前兩項。

首先是域名。條件許可的話,當然花錢買是最快的。如果想要免費取得,通常你的域名長相就會受到限制。另外,一些較熱門的免費域名服務,如 no-ip 等,因為拿它來做壞事的人也多,所以帶有這類域名的 URL 有時會被某些平台過濾掉 (案例: Facebook)。這邊推薦交通大學的 nctu.me 域名服務。只要註冊 TWID,就可以馬上免費使用。一個帳號可以註冊至多三個子域 (Ex: abc.nctu.me),每個子域下最多還可註冊 50 個再深一層的域名 (Ex: www.abc.nctu.me)。

再來是 SSL 憑證。就在幾年前,要想取得免費、又是世界公認的頂級 SSL 憑證根本就是痴人說夢。2014 年美國 ISRG 組織公開了 Let's Encrypt 計劃,希望能以免費提供頂級 SSL 憑證的方式,加速 HTTPS 取代 HTTP 的進程。此舉也帶動一些周邊的配套工具平台,例如此處要介紹的 SSLforFree。只需要在 SSLforFree 的網頁上簡單點幾下,就可以生成 SSL 憑證了。有一點要注意的是,目前 Let's Encrypt 計劃所發行的憑證,效期一律只有 3 個月。所以每 3 個月需要重新生成 (renew) 憑證。官方也有解釋此舉並不是要為難不想花錢的人,而是為了安全。

特別說明一下在 SSLforFree 上申請 SSL 憑證時,要怎麼快速地通過域名擁有權的挑戰。會有這個關卡是因為要確認「你真的是你宣稱的域名的擁有者」。否則隨便一個人都可以上去申請 google.com 或 facebook.com 的 SSL 憑證那還得了。

當你在 SSLforFree 上輸入完域名、提出憑證申請之後,會看到以下三種完成挑戰的方法。前兩個都需要真的在機器上跑服務才有辦法完成。第三種 (最右邊反白者),只需要在域名代管平台 (此例即為 nctu.me) 上新增一個 DNS TXT Record 即可完成。



選擇了第三種挑戰之後,會看到類似以下的指示:

Add the following TXT records below to the DNS server for each domain (In the Time to Live (TTL) field, enter 1): 
Add TXT record with the name/host _acme-challenge.zevoidxyz.nctu.me with the value M3DD3pe_VAHmvomFXSOjsu6pDL736ObRUCIOKejoTS0

到 nctu.me 平台上照著上述指示建立 TXT Record:


按下「申請」按鈕後,大約等個幾分鐘,到 SSLforFree 網頁上按下 「Download SSL Certificate」的按鈕,就會驗證挑戰是否完成,完成的話就會引導到憑證下載頁面。

2 則留言:

  1. 您好!
    在下我也用了 nctu.me 來註冊免費網域 ( xxx.nctu.me )。不過在 Let's Encrypt 取得免費憑證時,總會發生錯誤的訊息

    There were too many requests of a given type :: Error creating new cert :: too many certificates already issued for: nctu.me: see https://letsencrypt.org/docs/rate-limits/

    該網站的說明是,不論註冊哪一個網域,例如 aa.bb.nctu.me 或是 dd.nctu.me,都會以 nctu.me 進行 Rate Limits 限制,換句話說 nctu.me 似乎超出了 Let's Encrypt 的限制。

    請問這個有解嗎?

    回覆刪除
    回覆
    1. 我也沒有解哩, 事實上我還是從你的留言才得知 Let's Encrypt 有管控發證的頻率. 按您提供的那篇 Rate Limits 所揭露的資訊 -- 同個 domain "每週"只能發證 20 次. 分享給其它讀友了.

      刪除