IIS Log 追蹤用戶端使用的TLS版本與加密演算法

IIS Log 之封面圖

詮力科技的簡訊發送平台有提供API供客戶呼叫發送簡訊,近年來無論是網站或是API趨勢都是逐漸淘汰Http改走Https,但現實的困境是走Https時Server端與Client端要有共同支援的TLS版本以及TLS演算法,才能建立Https連線,進而呼叫API。
然而當Server要升級以支援新的TLS版本與加密演算法時,會發現現有的API的客戶太多,怎麼知道現行的客戶會不會因為Server升級導致API呼叫失敗呢?那就衍生了需要能夠追蹤用戶端使用的TLS版本與加密演算法的這個需求。


依照IIS預設的行為,如果Https連線無法建立,通常在第一時間連線就會斷線,IIS Log不會有任何的連線紀錄,除非客戶主動反映API無法連線,否則無法得知客戶無法發送API,反而會以為客戶只是沒有發API的需求。
經過一番搜尋,發現在Win 2012 R2以上的Server,IIS Log可以啟用設定,紀錄到用戶端的TLS版本與使用的加密演算法,這樣可以方便制定更好的Server升級策略,減少對客戶的不良影響,以下為設定方式:

1.打開C:\Windows\System32\inetsrv\config\ 中的 IIS 配置檔 ApplicationHost.config。

IIS Log 之範例圖

2.找到想要啟用TLS相關紀錄的網站區塊(<Sites>下依照不同網站會有個別的<site>)

IIS Log 之範例圖

3.在該網站區塊下的<logFile><customFields><clear />下(註:若網站區塊下無此區塊則需手動加入)加入下列內容:

<add logFieldName=”crypt-protocol” sourceName=”CRYPT_PROTOCOL” sourceType=”ServerVariable” />

<add logFieldName=”crypt-cipher” sourceName=”CRYPT_CIPHER_ALG_ID” sourceType=”ServerVariable” />

<add logFieldName=”crypt-hash” sourceName=”CRYPT_HASH_ALG_ID” sourceType=”ServerVariable” />

<add logFieldName=”crypt-keyexchange” sourceName=”CRYPT_KEYEXCHANGE_ALG_ID” sourceType=”ServerVariable” />

完成後config會如下圖所示:

IIS Log 之範例圖

4.回到IIS管理界面,選擇被設定好的網站→紀錄→選取欄位

可以看到剛剛設定的欄位加到自訂欄位區,已經有跳出新增的四個變數了

5.此時,新的IIS Log的變化為Log檔名增加了_x

Log的最後也增加了4個變數

其中TLS版本的變數定義請參考安全協定版本,加密演算法的變數定義則參考密碼套件演算法

這樣去分析IIS Log的TLS版本和加密演算法不是很直覺,有一個HttpLogBrowser工具可協助轉換這幾個變數。下載HttpLogBrowser後,選擇工具圖案設定的按鈕→Default settings→Analysis(2)→勾選『Translate cryptographic fields』

接著選擇載入的IIS Log,HttpLogBrowser此時顯示的Log還不包含那4個變數,要在標題列區按右鍵→Show Column Chooser

並勾選4個新欄位

畫面上就會把TLS版本以及加密演算法都顯示出來了。

此工具還可以很方便的下條件過濾條件,例如只顯示TLS 1.0的資料等,或是做統計圖表。但如果需要把結果匯出來,則需使用此工具的付費版本。

結論:本文做法僅提供Server要升級前評估客戶端使用狀況,決定是否可直接升級Server或是得與客戶協調,等客戶端Server也升級後才能升級Server的決策使用。若希望幫客戶做到無痛移轉,例如可以判斷客戶的TLS版本,若為舊TLS版本,將流量導向舊Server,若為新TLS版本,將流量導向新Server,就是另一篇文章的故事了。

Ref 1: Identify and forbid weak TLS usage in IIS (finalanalytics.com)

Ref 2: IIS Custom Logging for TLS | UKFast Documentation


發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料