2026年9月10日 星期四

一場 FortiGate IPsec 撥號 VPN 的「連線成功卻失敗」奇案:出廠憑證的 CA 鏈信任陷阱

 整篇文章透過AI將排查的內容整理之後產出

前言

最近排查了一個相當燒腦的 IPsec 撥號 VPN 連線問題:同一台筆電、同一份憑證、同一版本的 FortiClient,連線 A 台 FortiGate 完全正常,連線 B 台 FortiGate 卻穩定失敗。更詭異的是,B 台 FortiGate 自己看起來一切正常——IKE/IPsec SA 顯示協商成功,但 FortiClient 用戶端幾秒後就回報連線失敗,錯誤原因欄位還是空的。

前後花了不少時間交叉比對封包、debug log,最後定位到一個很少人會注意到的角落:同一台 FortiGate 出廠時,可能內建了兩張分屬不同 CA 體系的裝置憑證,而用戶端電腦剛好只信任其中一條。整個過程紀錄下來,希望能幫到遇到類似狀況的人。

環境與症狀

  • Gateway A(FortiGate-60F,FortiOS 7.4.11):問題發生端,IKEv2 撥號 VPN
  • Gateway B(FortiGate-201E,FortiOS 7.4.11):對照組,功能完全正常
  • 用戶端:同一台 Windows 筆電,同一份智慧卡憑證,FortiClient 7.4.1(Free 版與 EMS 版皆測試過)

症狀很單純但很誤導人:連線 Gateway A 時,FortiGate 端的 log 顯示 IKE/IPsec SA 協商成功(SA established),但流量是 0 進 0 出;FortiClient 大約 5~9 秒後就回報連線失敗,沒有具體原因。連線 Gateway B 則完全正常。

排查過程:一路排除的假設

依序測試並排除了以下幾個方向:

  • client-auto-negotiate / client-keep-alive 設定:調整成與 Gateway B 一致並啟用,無效。
  • Mode-cfg 指派網段:IP Pool 從 /32 改成 /24,無效。
  • MTU / 封包分片:一度懷疑是分片重組問題,但比對後發現 Gateway A 的 AUTH_RESPONSE 封包實際上比 Gateway B 更小,方向完全相反;用戶端封包截取也證實分片有正確重組,排除。
  • ISP / 網路路徑封包遺失:這個最關鍵。在 FortiGate 端與用戶端筆電同時做封包截取,結果發現——即使 FortiClient 已經回報連線失敗超過一分鐘之後,FortiGate 主動送出的 DPD(Dead Peer Detection)探測封包,仍然完整送達用戶端的網卡。這證實封包在網路路徑上完全沒有遺失,問題出在用戶端內部,不是網路傳輸層。

用戶端內部到底發生了什麼事

網路層排除之後,只能往 FortiClient 內部挖。開啟 Debug 等級日誌後,找到兩個關鍵線索:

  1. 狀態機日誌顯示 FortiClient 內部會先進入一個 Compliance Check 狀態,等待約 7 秒後,主行程會對負責 IPsec 協商的獨立子行程送出一個「關閉」訊息——這個時間點竟然略早於 FortiGate 端完成金鑰交換的時間,代表協商行程在收到關閉指令之後才完成協商,於是 FortiGate 端看到「成功」,FortiClient 上層卻已經判定「失敗」。
  2. 結構化安全事件日誌(forticlientlog.log)第一次給出明確的錯誤訊息:
   IKE phase1 authentication fail as peer's certificate is not verified

用戶端在驗證 FortiGate 回傳的憑證時失敗了——這才是真正的根因線索。

根因:同一台設備,兩張分屬不同 CA 鏈的出廠憑證

把 Gateway A 與 Gateway B 實際協商時送出的憑證抓下來比對(openssl 解析),發現:

項目Gateway A 的出廠憑證(失敗)Gateway B 的出廠憑證(正常)
Subject CNFGT60FTxxxxxxxxFG201ETxxxxxxxx
Issuer CNfortinet-subca2001support
有效期至20562038

兩台設備的出廠憑證,簽發 CA 完全不同——一個走較新的中繼 CA 鏈(fortinet-subca2001),一個走較舊的 CA(support)。用戶端 Windows 電腦的信任存放區裡剛好只信任舊的那條鏈,所以連線 Gateway A 時,憑證驗證必定失敗;連線 Gateway B 則因為剛好信任那條舊鏈而成功。

更有趣的是:Gateway A 這台設備上,其實同時內建了另一張出廠憑證,走的正是與 Gateway B 相同的舊 CA 鏈,Subject CN 與原本那張完全相同(代表是同一台設備)、簽發日期也相同——證實同一台設備出廠時就準備了兩條不同世代的憑證鏈,只是預設用的是比較新的那條。

進一步查了 FortiClient 的連線設定檔,發現它在驗證對方憑證時,並沒有自己另外維護一份信任清單,而是直接呼叫 Windows 作業系統本身的憑證存放區。也就是說,問題根源其實是「這台電腦的憑證信任清單」,不是 FortiClient 軟體本身的缺陷。

原廠回覆:官方證實的憑證架構差異

把這個發現拿去問原廠支援,得到的答覆正式確認了背後的邏輯:

  • 較新機型:具備中繼 CA 與根 CA 的完整架構,出廠憑證由中繼 CA 簽發,有效期到 2056 年;同時保留一張較舊架構的備用憑證,有效期到 2038 年。
  • 較舊機型:沒有中繼 CA,出廠憑證直接由根 CA 簽發,有效期到 2038 年——這張憑證與新機型上的備用憑證屬於同一套(舊式)體系。

這完全解釋了觀察到的現象:新一代設備預設用的是新憑證鏈,用戶端電腦如果只信任舊鏈,接上新機型時就會踩到這個坑。

兩種解法,各有取捨

排查到這裡,實際驗證出兩種都可行的解法:

方案一:直接切換到設備上內建的舊鏈憑證

操作最簡單,改一行設定即可:

set certificate "備用憑證名稱"

缺點是這張備用憑證有效期較短(2038 年到期),而且只解決了這一台設備,換一台新設備仍可能重演同樣問題。

方案二:在用戶端電腦補齊完整信任鏈

保留原本效期更長的出廠憑證不變,改成在用戶端電腦安裝完整的信任鏈。解析憑證的 Authority Key Identifier 延伸欄位,可以反推出完整鏈是三層:裝置憑證 → 中繼 CA → 根 CA。原廠支援確認可以直接從 FortiGate GUI 的「System > Certificates」頁面,在 CA 憑證清單裡點兩下目標憑證即可下載。

取得中繼 CA 與根 CA 兩張憑證檔案後,分別匯入 Windows 的「中繼憑證授權單位」與「受信任的根憑證授權單位」存放區,原本無法驗證的出廠憑證就能正常通過驗證了——實際測試確認有效。

這個方案的好處是可以繼續使用效期更長的原廠憑證,而且往後不管接上任何一台使用同一條新版憑證鏈的設備,都不會再發生同樣的問題,算是比較治本的做法。

心得

這個案例最有意思的地方在於:FortiGate 端從頭到尾都顯示連線成功,SA 建立、金鑰交換全部正常,完全看不出任何異常;真正的失敗訊息只存在於用戶端的 Debug 等級日誌裡,而且還藏在一個平常很少人會去開的結構化安全事件日誌檔案裡。如果只看 FortiGate 端的 log,這個問題大概永遠找不到根因,只會一直懷疑網路、懷疑相容性、懷疑各種設定組合。

幾個帶得走的心得:

  • 遇到「伺服器端看起來成功、用戶端卻回報失敗」的情境,第一時間應該懷疑是用戶端內部邏輯判斷失敗,而不是一味在伺服器端或網路層打轉。
  • IPsec 憑證驗證失敗這種問題,光看 IKE debug log 往往看不到明確原因,一定要另外開用戶端軟體的 Debug 等級日誌才有機會抓到真正的錯誤訊息。
  • 同一款硬體、同一個廠牌,不代表出廠預設憑證用的是同一套信任體系——尤其是新舊世代交替的產品線,這種細節差異很容易被忽略。

2025年9月9日 星期二

Solarwinds納管Cisco 9200,Solarwinds的UDT功能失效問題

 之前從Cisco 2960換成Cisco9200的時候,就已經發現到Solarwinds上的UDT(User Device Tracker)這個功能會失效,像下面那樣,什麼資訊都沒有

問廠商得到的答案是,Solarwinds認為是Cisco的問題,Cisco認為是Solarwinds的問題。

後來網路上爬到大神有提供解法

https://netcamp.ch/guides/cisco/cisco-solarwinds-udt-snmpv3 

照著設定,UDT功能恢復啦



2025年8月1日 星期五

IPHONE無法連線到企業網路

最近遇到無法連線的問題,紀錄一下

環境: 

1.IPHONE:14.7.1

2.WLC:Cisco WLC 9800,版本17.9.6

3.認證伺服器:微軟NPS

問題描述:

手機要連線到使用WPA2認證的企業網路,輸入完帳密後,跳出憑證不受信任,是否要信任的視窗,點選"信任"後,跳出無法連線網路。

排錯:

1.在NPS上的事件檢視器找不到登入異常的log。

2.開始在WLC上找訊息

WLC> Troubleshooting >Radioactive Trace,用問題手機的MAC address追蹤,發現有個錯誤訊息是

(ERR): MAC: xxxx.xxxx.xxxx  Dropping the disassoc or deauth request. 11w not enabled


後來在WLC上將該SSID啟用PMF (Protected Management Frame),選擇Optional後正常。


20250909更新

又遇到一台Ipad(版本18.6.2)無法連線,連線PSK的企業網路。

但錯誤訊息是"此網路所執行的Wi-Fi頻道正由數個其他鄰近的網路使用中。重新啟動無線路由器可能會讓其自動選用最佳的頻道,並起解決這個問題。

一樣將該SSID啟用PMF (Protected Management Frame),選擇Optional後正常。

2024年8月1日 星期四

Fortigate使用email啟用帳號二階段驗證(MFA)

 1.首先設定Fortigate的SMTP

config system email-server


       set reply-to {Sender_email_address}

       set server {SMTP_server_FQDN/IP}

       set port {SMTP_server_port_number}

       set authenticate {enable | disable}

       set username {username}

       set password {password_string}

       set security {none | starttls | smtps}

end


2.設定使用者啟用二階段驗證,以及驗證碼寄到哪個信箱。

這個設定只能使用CLI,GUI畫面只有Fortitoken cloud與Fortitoken選項

config user local

    edit {username}

       set type password

       set two-factor email

       set email-to {user_email_address}

       set passwd {password}

    next

end


config system admin

    edit "admin"

       set type password

       set two-factor email

       set email-to user_email_address

       set passwd password

    next

end


參考官方KB:

https://community.fortinet.com/t5/FortiGate/Technical-Tip-Email-Two-Factor-Authentication-on-FortiGate/ta-p/194890


2023年7月20日 星期四

android 11手機無法連上Cisco的無線網路(Cisco/Aironet)

 從Cisco官方論壇有人回答是CSCvu24770這個BUG。

CSCvu24770提到是android 10,但此篇文章也有提到android 11也會遇到。

解決方式就是在WLAN→選擇要調整的SSID→Security→Layer 2

Fast Transition的選項從 Adaptive改成enable。

應該是雙方設備協商會失敗導致,強制啟用Fast Transition,也就是802.11r。

2022年10月21日 星期五

如何將Fortianalyzer的raw data log,過濾出想要的資訊後拋出

我的Router/Switch的syslog是拋到Fortianalyzer作保存。
最近有需求想對關鍵字的log轉拋或是告警,找了老半天終於查到如何去過濾。
如下圖
是用 " ~ " 代表包含.....






參考官方KB

2022年9月16日 星期五

Fortigate發送訊息到Line

 Fortigate如何訊息(比如管理員登出登入、VPN登出登入)透過LINE發送?

基本上就是兩項事情

1.IFTTT

2.Webhook

首先先到IFTTT註冊帳號,並關聯Line服務以及webhook

底下是參考截圖


Line Notify 提供三個 Vaule: Value1、Value2 、 Value3
Recipient 下拉選單可以看到自己的 Line 群組清單,所以可以指定發送訊息到什麼群組內

網址後馬賽克的內容就是金鑰,請不要外流,外流的話就可以透過你的 LINE Notify 發訊息給你(好像也還好XD)




底下是Fortigate的設定部分

Security Fabric > Automation >


URL就是Webhook給你的那一串網址


上圖就是結果~~~



還有注意一點,如果有設定alertmail的,請記得拿掉告警等級,這個會影響Automation
這個也是跟原廠Support找好久才找到原因.....

config alertemail setting
set username "XXX@.com.tw"
set mailto1 "XX@.com.tw"
set filter-mode threshold
set severity critical
end

Fortianalyzer沒有像Fortigate這種設定方式....希望未來可以支援~