講個秘訣:讓開發環境也有受信任的 HTTPS 可以用!

How to get trusted HTTPS in development environment

petertc
6 min readMay 8, 2019
Source: https://kamsar.net/index.php/2017/10/All-about-xConnect-Security/

HTTPS everywhere! 現在無論是開發 web 還是 chatbot 應用,都很易碰到要提供 HTTPS 連線的需求。這篇文章提供我知道的幾種作法供大家參考~

TL; DR

以下方案可以讓您建立 HTTPS endpoint,其憑證由受信任的 CA 所簽發,適合用在開發環境上,而且免費!

  1. Heroku
  2. Ngork
  3. xip.io + Let’s Encrypt + Nginx/Certbot

適用情境

  • 開發階段,需要整測或跟外部系統介接,例如 webhook。
  • 需要對外提供 HTTPS endpoint,且其憑證需要能被 client 接受。

需要考量的點

要對外提供受信任的 HTTPS endpoint,首先當然是讓外部能連到你的應用。此外,申請合法憑證只有 public IP 一般是不行的,會需要有一個 domain name 能正解到你的應用 binding 的 IP。當外部 client 可以用 domain name 連到你的應用後,最後才會是憑證是否受信任的問題。接下來的解法就會考量這三點需求,以不同的作法加以 cover。

Solutions

我目前知道有三種作法可以作到對外提供受信任的 HTTPS endpoint,這三種作法性質都不太一樣,穩定度/維護成本也有所差異。以下分別簡單說明一下。

Heroku

Heroku 是一個很多人用的 PaaS 平台,因為是公雲平台因此 Internet 的 client 不是問題!將應用部屬到 Heroku 以後,會得到一個 HTTPS 的 endpoint,因此 domain 和受信憑證的問題也直接滿足了,棒棒!

在下圖的範例中,以指令 heroku create sushi-inc 建立一個heroku app,就會得到一個 HTTPS 的 endpoint https://sushi-inc.herokuapp.com/ ,就是那麼簡單!

Source: https://www.heroku.com/

另一方面,某些應用類型可能希望對底層有更多控制,不適合使用像是 Heroku 這種限制較多的 PaaS 平台。此外,由於Heroku 的免費方案會sleep節省資源,大概比較適合開發者自己做測試,要給別人做beta測試可能都有點勉強。此時,就可能要考量以下不同的解法。

Ngork

Ngork 是一個很有名的 tunneling 服務,但我是後知後覺從強者我朋友 Jay 大分享開發微信公眾號經驗的文章才知道的。這個服務主要功能就在於讓 localhost 的應用可以暴露到 Internet 上,讓外部可以存取方便測試。在下圖的例子中,可以看到藉由 Ngork,可以把 https://kateapp.ngork.io 轉導至本機的 3000 port。這就解決了前面提到的三大需求:public access、domain name、以及被信任的 SSL 憑證。由於是 run 在本機,因此也沒有前面 Heroku 的一些限制條件。

Source: https://ngrok.com/

Ngrok 很好很強大,但也不是沒有缺點。首先他的免費方案提供的 domain name不是固定的,每次重起 ngork 就會變動,這對介接 webhook 相當不方便,因此應該也是比較適合做短期測試使用。此外有一個非戰之罪,就是他太有名了!!而且應該很常被拿來做壞壞的事情,因此很多內容過濾機制都會阻擋 Ngrok 的連線,這很常造成第一次使用的人一頭霧水,不知道為什麼網址連不到。

xip.io + Let’s Encrypt + Nginx/Certbot

最後這個方案比較麻煩,但可以克服前面兩種解法的問題。

這個方案首先使用 xip.io 解決 domain name 的需求。簡單來說如果你的 IP 位置是 203.64.138.8 ,那 203.64.138.8.xip.io 這個domain就可以正解到你的 IP!太神奇了,傑克!BTW,其實他不只能作到 one-to-one mapping,從下圖他網站的說明可以看到,他還可以再支援 wildcard DNS 的功能。

Screenshot of xip.io

xip.io 背後是透過 DNS 機制去完成,因此沒辦法處理憑證的部份。但有了 domain name,憑證就簡單了,因為我們有 Let’s Encrypt!Let’s Encrypt 應該是目前免費且廣被信任的 CA 最好甚至唯一的選擇,所以相關的介紹文章很多了,這邊就不重複敘述。這邊只建議與 Nginx、Certbot搭配使用。Nginx 作為 reverse proxy ,可以幫妳做 SSL offload,如此你的應用就不須要為了提供 HTTPS 做額外的修改。Certbot可以幫妳化簡繁複的憑證申請/更新機制,且可以直接產生 Nginx 設定檔!Nginx reverse proxy 設定可以參考這篇;Certbot配置 Nginx 設定檔可以參考這篇

這個 xip.io + Let’s Encrypt + Nginx + Certbot 四合一整合方案目前感覺是開發階段測試整合最好的選擇,因為他不像 Ngork 會被擋或浮動 domain ,但這個方案的最大限制是你要有一個固定 IP,要不然就退回變成跟 Ngrok 一樣,有網址變動的問題。另外 xip.io 看起來是佛心的免費服務,也是有突然收掉的風險。

Q&A

Q1:阿不就花錢 domain / 憑證買一買就好了?

正解!對工程師來說可以花錢解決就不是問題!但在某些恐龍公司這核銷流程跑完 project 可能也開天窗了。另外對於 side project 能省點錢救救老殘窮也不錯。

Q2:阿不就 self-signed 就好了?

目前常用的方法是這樣沒錯,但這樣還要去設定你的 client / browser 讓他信任你的自簽憑證沒有比較省工RRR

此外,如果你的應用需要介接一些資安基本教義派 (X) 重視資安 (O) 的服務,用自簽憑證是有可能會碰到問題的。

舉例來說,介接 telegram 的 webhook 如果不是走正式憑證,必須額外處理讓憑證受信任,又或著是 LINE message 的 webhook 更直接要求必須是廣受信任的 CA 簽發的正式憑證才行,自簽是不行滴。

Final Word

妳還知道什麼其他解決 trusted HTTPS 的方法嗎?歡迎推文讓我知道!感謝!

--

--