雖然說是甘苦談,但是好像也沒有這麼甘苦,大概總耗時只有 48 小時,不過中間踩了蠻多雷的。

這次主要的目標是要讓 MOLi Bot 跟政府的災害示警公開資料平台做介接,這樣以後就不用一直去按 F5 刷停班停課網頁,MOLi Bot 會直接告訴我們 XDDDD。

以目前來說,災害示警公開資料平台上,提供兩種串接方式:第一種是一般 Open API,利用 JSON 格式的資料,讓使用者或是機器自己定時去抓取新資料,而這種方式是不需要註冊的,直接 call API 即可;另一種是該平台有提供推播服務,也就是當有新消息,平台會自動把訊息利用 http POST 方式推送到你的網站或程式,但是這種方式就必須要先在平台上登記你要用來接收 data 的 URL。

這邊就開始雷了,首先平台用 XML 格式傳資料什麼的就不提了,這只是一件小事,每個語言應該都有別人寫好的轉換工具可以用,例如我用的是 Laravel 這個 PHP framework,那就可以使用 SoapBox/laravel-formatter 這個 library 去做轉換,全部轉成 JSON 格式方便後續處理或是再開放給實驗室其他人使用。

接下來的重頭戲是要測試平台是不是可以成功的把資料丟到 MOLi Bot 來,平台上很貼心地做了一個測試發送的功能:
災害示警公開資料平台測試發送功能截圖

這裡輸入框的標題雖然是寫「HTTP 網址」,但是其實 http 或是 https 都可以接受,那當然,程式都寫好了,當然是 URL 填一填,測試過了,打完收工躺著接資料阿!

但是事情不是我這些傻蛋想的這麼簡單,就當我開心的填上 URL 按下測試發送按鈕之後......
測試發送壞了

WTF!!!!!

出問題了,直覺反應先去看 nginx 的 access log 及 error log......

國防布

被國防布蓋住了

什麼 log 都沒有,沒錯,什麼都沒有

但是在同樣設定下,telegram bot api webhook 是正常的
telegram nginx access log

那我們來測一下 http 的部份好了,我在我們的 nginx 上有設定 http 強制重導向到 https,但是如果有 http request 進來,在 access log 裡至少會有一條 return 301 的紀錄
ncdr nginx access log

恩⋯⋯有耶,然後我就覺的是不是對方不小心把對 https 的支援怎麼了,畢竟 M$ 的東西都只會告訴你錯了,但不會跟你說錯在哪(?
然後我就寄信去詢問,過了幾天,突然有一通逢甲大學打來的電話,跟我說他們的測試都是正常的。

在這邊先感謝 逢甲大學 GIS 中心 協助測試。

好吧,果然事情還是不像我這個傻蛋如此簡單,那先來找找網路上有沒有給人測 http POST(接收端)的服務,結果還真的被我找到一個叫 Henry's HTTP Post Dumping Server 的服務,顧名思義,這個工具可以把你的程式所送出的 http POST request dump 出來,存成文件讓你看,包含 header 以及 payload,內容很詳細。
(後續還有發現另一個叫 httpbin,功能差不多,但是可以支援的 method 更多)

那利用 Henry's HTTP Post Dumping Server 測試後發現所有功能(包含 http 及 https)都是正常的,那也沒其他招了,在我這裡 http 正常,但是 https 卻是壞的,所以只剩 https 可以測了吧

接下來就到 Qualys SSL Labs 測試兩個站台的 https 有什麼不同吧!

經過比對,我跟 Henry's HTTP Post Dumping Server 的 SSL 設定差異只在於 Henry's HTTP Post Dumping Server 有開 TLSv1 而我的沒有,所以就去把 nginx 的 TLSv1 打開,那就 OK 了!

筆者補充:
  • 如果單純想知道某台 web server 上有使用哪些 SSL 加密,可以利用 nmap 這個工具,在 Linux CLI 輸入:$ sudo nmap -script ssl-enum-ciphers -p <port> <hostname>
    就可以快速知道該 web server 支援哪些加密方式。
  • 根據 Security/Server Side TLS - MozillaWiki,現在大部分攻擊都發生在 SSLv3 及 TLSv1,部份安全等級較高的瀏覽器遇到支援這兩種加密方式的站台就會跳警告,因為有開 fallback 就可以用強制 fallback 的方法攻擊,所以現在建議將這兩種加密方式關閉,只使用 TLSv1.1 及 TLSv1.2,這也是這篇文章會產生的原因。
使用工具列表:
  • Postman:一個 API client 測試工具,支援標準 http method。
  • httpbin:測試用 http(s) server。
  • Qualys SSL Labs:測試 web server SSL 設定,並給予評等,建議評等至少要拿到 A,才算是合格的設定。
  • Mozilla SSL Configuration Generator:Mozilla 所提供的一個針對現在常用 web server SSL 的設定檔產生工具。