Contents

設備根憑證不正確導致不能打API問題

最近要上線的專案會用到 LINE WEBHOOK
竟然上正式環境 line 後台 webhook 模擬可以觸發 API
但使用行動裝置竟然不可以打…(access.log沒有收到訊息)
我們公司有防火牆、Server Load Balancer…
查詢上花了不少時間

由於流程很多,我上面就直接講重點

檢查方向

LINE 文章有提到注意事項

在設定HTTPS伺服器時,有下列幾點必須注意的事項:

  1. HTTPS伺服器所使用的根憑證(Root CA)必須是在LINE平台的白名單列表中,否則LINE平台會拒絕傳送訊息。在白名單列表中大多數的憑證都需要付費申請,但是LINE平台也支援常用的免費憑證,例如Let’s Encrypt。
  2. 請勿使用已知具有安全性漏洞的協定(例如SSL v2或SSL v3)或Cipher Suite(例如SWEET32或CVE-2016-2183)。
  3. 請務必正確設定中繼憑證(Intermediate certificate),以避免無法對應到根憑證而發生錯誤。這是最常見的問題通報狀況,請在設定HTTPS伺服器時多加留意。

開發LINE聊天機器人不可不知的十件事 - LINE ENGINEERING

我們公司瀏覽器看網頁沒有跳出安全性問題,Android、Iphone、Linux 也沒有問題
所以第一項認為沒問題,但魔鬼出在細節裡
文章裡的根憑證白名單列表看不見
Google 一下會發現 TWCA 沒有這個憑證,後面再詳細說明
developers.line.biz/media/messaging-api/build-bot/ca_root_v2.txt
總之我們前面認為這一段沒有問題

2,3 憑證都確認都沒有問題

SSL Certificate Comparison and Reviews

這個網站就可以檢查憑證是否有問題

Load Balance SNI 設定

當我們憑證出問題的時候
網路同仁有打電話給 Load Balance 廠商詢問設定
廠商提到要設定 SNI
讓我想到之前驗證環境的問題
Java 因憑證 SNI 問題驗證不過 | 程式狂想筆記
原來 Apache 做的設定,對應 LB(負載平衡)機器也要做這些設定
但遺憾還是沒有解決問題

根憑證是否為裝置(Client)認證

前面第一點已經據透了
我們發現驗證環境的萬用憑證可以跑
但是正式環境驗證憑證不可以跑

原來公司舊有憑證是四層(TWCA)
但是新憑證是三層(TWCA)
這2種都是合法憑證

./l4.png

./l3.png

從憑證路徑可以看到一個三層,一個四層
但偏偏 LINE ROOT CA 只有CN=TWCA Root Certification Authority, OU=Root CA, O=TAIWAN-CA, C=TW
沒有 TWCA ROOT CA

公司剛好因為換新憑證都改用三層
所以會有這個問題…

所以中繼憑證改成四層就沒這個問題

  1. 完美成果

./cgh.png

./cgh2.png

  1. root ca 包在中繼憑證,順序錯誤

./eci.png

./eci2.png

  1. root ca 包在中繼憑證+中繼憑證順序錯誤

./linewebhook.png

./linewebhook2.png

我的建議憑證包四層比較不會出問題
因為第二層憑證是一樣的
第三層的話,Root CA 就會抓到白名單

假如四層的話,中繼串到第三個後面,就是白名單
不過 TWCA 說最新發的都是三層??這原因我就沒深入追查
產生自簽憑證筆記 | TWCA 憑證為什麼有三層,四層串到同一個憑證呢?
我猜應該相同名字會抓出來比較
剛好兩張私鑰都是一樣的

題外話,這邊我發現有趣現象
用 Firefox 是三層(沒有看到四層),Chrome(IE,Window)是四層
不知道是不是憑證是用 名稱去找的 這個是我猜的,目前沒有找到資訊

憑證簽發者(ISSUER)的名稱與憑證主體(Subject Name)名稱相同!
參考:憑證串鍊的解釋 - SSL憑證推薦網 | SSL憑證 | code Sign
難道真的是看名字??
Android也是三層
剛好有抓到 TWCA Root CA 根憑證所以才三層
至於怎麼抓的就不研究了

現在回想萬用憑證(WildCard)和中間憑證小記 | 程式狂想筆記
是不是沒有串到根憑證??現在也查不到了

檢查 Chipser

之前有聽說可以不戴加密做 TLS
有看到這個關鍵字 null cipher suites
不知道是不是指這個?
我就不詳細研究了

名詞整理

根憑證

Self-Signed CA
亦可稱為 root CA。由於此種 CA 所發的憑證(certificate)是不經由任何上層 CA 所認證,而是以「自行認證」的方式進行認證。因此像是最上層的商業 CA,或是自行架設內部認證用的 CA,都可以屬於此類。
參考來源: Certificate Authority(CA) 憑證簡介 @ MISTECH 技術手抄本 :: 痞客邦 ::

簡單來說就是根憑證,一開始你的電腦微軟附的作業系統裡面,有裝一些憑證,隨著系統更新,這些憑證都會update。
根憑證因為沒有上層,所以你電腦有根憑證白名單,就會算是合法的憑證。

中繼憑證

./chain.png
參考來源:那些關於SSL/TLS的二三事(十二) — Chain of Trust | by Carl | Medium
這篇說得很清楚,但我也只是略懂略懂
一直在想為什麼會有中繼憑證,缺少中繼憑證會發生什麼事?順序錯會發生什麼事?
當前憑證並非是 Root CA 認證而是靠中繼憑證…
中繼憑證會再往上根 Root Ca 驗證
到白名單就是安全性任憑正

憑證加密過程

https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/PublicKeyCertificateDiagram_It.svg/langzh-1100px-PublicKeyCertificateDiagram_It.svg.png

簡單說就是 公鑰 + 上層憑證私鑰 = 憑證
這張憑證就會給你設定 Apache 上
驗證憑證會跟上層憑證公鑰解開加密確認值
一致就確認沒問題,繼續往上面憑證追查,直到 Root CA

整理憑證鍊遇到問題

Contains anchors

包到主憑證,之前有看過文章中繼憑證不需要包 root ca

Chain issues: Contains anchors
Trouble with intermediate certificate “Chain Issues: Incomplete”

Extra download

好像就是中繼憑證跟給予憑證沒包在一起樣子?
我沒有實驗,像 nginx 就沒有中繼憑證設定
不是很確定原因

How to fix “Extra download”
Multiple Certification Paths
https://www.ssl.com.tw/Down/

下載憑證方法(無法看到中繼憑證)

Get SSL Certificate from Server (Site URL) - Export & Download - ShellHacks

1
2
3
4
5
# 下載憑證 (不包含中繼)
echo | openssl s_client -servername NAME -connect HOST:PORT |\
  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > certificate.crt
# 查看中繼憑證 (-A 數字可以大一點)
 echo ""|openssl s_client -connect www.cgh.org.tw:443 2>&1 | grep -A 9 "Certificate chain"

其實之前就有做過類似筆記:Linux 指令確認SSL憑證 | 程式狂想筆記

格式轉換

openssl 指令 command line - 轉檔 pem/der/p7b/pfx/cer | SSORC.tw

其他

安裝中繼憑證

see chain

憑證教學

小記

原本這個問題沒有頭緒,line webhook 後臺可以打得到AP
但是用手機 LINE APP 操作就抓不到
有用防火牆看到 Server Action RST
正常Action:Session close
後來用公司 Load Balancer 作風包解析(tcpdump)
發現這一塊 https 三項交握有問題

看了這篇除了驗證憑證,那註銷後的憑證要怎麼確認
Google 一下找到 CRL(寫程式是良心事業: OCSP & CRL 介紹)
這邊就不先繼續研究了

我覺得之後可以手動做做看

TODO: 之後可能照保哥做做看自簽名憑證
產生自簽憑證筆記 | 程式狂想筆記
完成測試

這篇算是我的筆記,也許會有很多寫錯,建議大家還是看看大神寫文章!!
購買與安裝 SSL 憑證完全攻略(以 IIS7 為例) | The Will Will Web
如何使用 OpenSSL 建立開發測試用途的自簽憑證 (Self-Signed Certificate) | The Will Will Web
免費申請 StartSSL™ 個人數位簽章與網站 SSL 憑證完全攻略 | The Will Will Web