V2Ray TLS 握手失敗、憑證錯誤排除:系統時間、SNI 與 allowInsecure 設定

憑證過期、x509 錯誤或握手逾時,常見原因包括系統時間不準、SNI 與憑證網域不符,以及指紋設定錯誤。本文整理逐項檢查方式與正確設定方法。

本文重點

適用於 v2rayN、v2rayNG 與 v2flyNG 的 TLS 連線排查。先從日誌判斷是憑證驗證失敗還是連線逾時,再檢查裝置時間、節點 SNI、伺服器憑證鏈與指紋參數。每次只修改一個欄位,連線恢復後仍應保持憑證驗證開啟;若節點使用 REALITY,請改為核對專用驗證參數,不要直接套用一般 TLS 的憑證處理方式。

先分層判斷:TLS 錯誤發生在哪個階段

TLS 握手介於建立連線與代理協定驗證之間。VMess、VLESS 是代理協定;TLS 則是傳輸安全層,兩者不是同一個開關。節點清單顯示已選取、核心正常執行,只代表本機程式已啟動,不表示遠端憑證已通過驗證。先確認所選節點的「傳輸層安全性」使用 TLS 還是 REALITY,再判斷本文哪些步驟適用。

解析伺服器連線至遠端連接埠TLS 交涉驗證憑證代理協定驗證

在 v2rayN 主畫面的日誌區,找到失敗請求發生的時間,並複製最內層的錯誤原因,不要只看外層的「連線失敗」。v2rayNG 與 v2flyNG 可從側邊選單開啟「日誌」查看。不同版本的選單名稱可能略有差異,記下用戶端版本、核心類型、節點安全類型與完整錯誤訊息即可;分享日誌前,請遮蔽訂閱網址、使用者識別資訊與驗證資料。

錯誤:x509: certificate has expired or is not yet valid

原因與解決方式:裝置目前時間不在憑證有效期間內——先校正本機時間;若時間正確,請伺服器維護者確認憑證是否過期,以及續約後是否已載入新憑證。

錯誤:x509: certificate signed by unknown authority

原因與解決方式:憑證鏈無法連結至受信任的根憑證——確認伺服器是否有提供中繼憑證,並檢查自簽憑證、過舊的信任庫,或網路中的 TLS 檢查設備。

錯誤:context deadline exceeded

原因與解決方式:作業未能在期限內完成;僅憑這一行無法判定是憑證問題——請搭配前後日誌檢查網域解析、遠端連接埠與握手過程。

同步系統時間:先排除本機誤判憑證效期

憑證有生效與到期時間。裝置年份、日期或實際系統時鐘錯誤,可能讓有效憑證被判定為「尚未生效」或「已過期」。只修改畫面顯示的時區,通常無法修正實際時鐘偏差;時區只影響時間的顯示方式,憑證驗證依據的是實際時間。

  1. 確認日期

    在 Windows 開啟「設定」→「時間與語言」→「日期與時間」,檢查年份、月份、日期與時區。先修正明顯錯誤,再嘗試透過網路同步。

  2. 同步時鐘

    開啟「自動設定時間」,再於「其他設定」或「同步時鐘」區域點選「立即同步」。Android 請開啟系統「設定」→「日期與時間」,啟用「自動設定時間」;部分系統會將此選項放在「系統」中。

  3. 確認同步結果

    在 Windows 查看上次成功同步的時間。若同步失敗,請使用系統管理員終端機執行下方指令檢查時間服務;若網路未允許時間同步流量,需先處理網路或服務狀態。

  4. 重新連線

    中斷目前連線,再啟動同一個節點並送出一次新請求。請比對新日誌的時間戳記,不要根據日誌面板保留的舊錯誤判斷修改結果。

w32tm /query /status
w32tm /resync

上述指令適用於 Windows 時間服務,不是代理核心指令。若顯示服務尚未啟動,請先在系統「服務」中檢查「Windows Time」;受組織原則管理的電腦,應依管理員指定的時間來源處理。若重新啟動後日期反覆遺失,也要檢查裝置時鐘維持狀態與系統時間設定,不要一再更換節點。

設定 SNI:連線位址不等於憑證網域

節點的「位址」決定要連線的伺服器;「連接埠」決定要連線的服務;SNI 通常透過核心的 serverName 欄位指定,用於選擇 TLS 虛擬主機並驗證憑證名稱。連線位址可以是 IP,SNI 仍可填網域。這種設定本身沒有問題,前提是遠端服務確實會依該網域提供相符憑證。

  • 位址:填入訂閱或伺服器設定提供的主機名稱或 IP,不要任意與 SNI 對調。
  • 連接埠:依節點設定填寫。443 是常見的 TLS 連接埠,但不是固定要求,不要將所有節點都改成這個值。
  • SNI / serverName:填入伺服器要求的憑證網域,例如說明中的 example.com;此處僅示範格式,實際值必須依節點設定填寫。
  • 輸入格式:只填主機名稱,不要加上 https://、路徑、查詢參數或 :443。
  • 憑證涵蓋範圍:現代憑證驗證通常會檢查 SAN。萬用字元 *.example.com 通常可匹配 a.example.com,但不匹配根網域 example.com,也不匹配 a.b.example.com。

在 v2rayN 主畫面雙擊目標節點,進入編輯視窗,找到「傳輸層安全性」中的 TLS 設定,確認「SNI」或「serverName」。在 v2rayNG、v2flyNG 的節點編輯頁面確認同名欄位。不同版本介面可能只顯示其中一種名稱;不要把 WebSocket 的「Host」誤當成 SNI,前者是 HTTP 標頭,後者用於 TLS 握手階段。

憑證鏈與握手逾時:分別檢查名稱、信任與連接埠

名稱不符與未知簽發者是兩種不同問題。前者要檢查 SNI 是否符合憑證 SAN 範圍;後者則要確認憑證鏈是否完整,以及簽發者是否受目前環境信任。即使瀏覽器能開啟同一網域的網頁,也不能直接證明代理連線正常:瀏覽器可能連到不同連接埠或位址,也可能採用不同的信任設定與憑證鏈補全機制。

日誌線索優先檢查處理位置
expired / not yet valid實際系統時間、憑證有效期間裝置時間設定;伺服器憑證部署
certificate is valid for…not…SNI 是否符合憑證 SAN節點 TLS 欄位;伺服器虛擬主機
unknown authority中繼憑證、根憑證信任、自簽憑證伺服器完整憑證鏈;受管理的信任設定
handshake failureTLS 參數、用戶端指紋、伺服器政策節點傳輸設定;伺服器握手日誌
timeout / deadline exceeded網域解析、連接埠是否可連線、封包遺失與服務回應網路路徑;遠端監聽與防火牆

Windows 可使用 PowerShell 檢查目標 TCP 連接埠。以下網域與連接埠僅為指令格式範例,請替換成所選節點的實際位址與連接埠。TcpTestSucceeded 為 True,只代表 TCP 連線成功,不表示憑證、SNI 或代理驗證設定正確。

Test-NetConnection -ComputerName example.com -Port 443

已安裝 OpenSSL 的環境可進一步查看遠端傳送的憑證鏈。指令中的連線目標與 SNI 可以不同,分別對應節點的「位址」與「serverName」。以下範例以示意網域表示兩者,並明確啟用名稱檢查:

openssl s_client -connect example.com:443 -servername example.com -showcerts -verify_hostname example.com -verify_return_error
  • 檢查回傳憑證的 SAN、有效期間與驗證錯誤;不要只因為有輸出憑證就認定成功。
  • 伺服器續約後仍回傳舊憑證時,請檢查憑證檔案路徑,並重新載入實際負責終止 TLS 的服務設定。
  • OpenSSL 與代理核心可能使用不同的根憑證信任庫;工具檢查結果可協助定位問題,但不能取代用戶端的最終測試。

指紋與 REALITY:勿混用兩套排查方式

用戶端指紋會影響 ClientHello 的呈現方式,無法修正錯誤的憑證網域、過期憑證或缺少的中繼憑證。Xray 的相關功能與 V2Fly 不應假設完全相同;v2rayNG 使用 Xray 核心,v2flyNG 使用 V2Fly 核心,不能只因兩者介面都有 TLS 選項,就認定所有參數都通用。

  • 一般 TLS 節點:先還原訂閱原本的指紋設定。只有在伺服器明確要求時才依指示填寫,不要在不同指紋值之間盲目切換。
  • 更換核心後:檢查日誌是否出現未知欄位、不支援的選項或設定解析失敗。這些屬於設定相容性問題,不是憑證驗證問題。
  • REALITY 節點:確認伺服器指定的 serverName、公鑰相關參數、shortId 與指紋;不同版本介面中的欄位名稱可能不同,請以對應核心文件與伺服器設定為準。
  • 設定範圍:不要自行猜測 REALITY 的目標網域,也不要用一般 TLS 的「略過憑證驗證」來修復 REALITY 驗證失敗。

若一般 TLS 節點只有使用特定指紋才能完成握手,也要檢查伺服器存取政策與網路中介設備。請保留修改前後的完整錯誤訊息,才能判斷是握手交涉恢復,還是測試請求其實改走其他出口。排查期間固定使用同一節點與同一個目標請求,避免同時切換路由規則、TUN 與系統代理。

allowInsecure 的取捨:保留驗證並修正根本原因

allowInsecure 在一般 TLS 設定中,用來控制是否允許略過標準憑證驗證。啟用後,流量仍可能經過加密,但無法再透過正常的憑證鏈與名稱驗證確認伺服器身分,可能遭冒充或被中間人攔截。這不是「提升相容性」或「加快速度」的開關。

以下是一般 TLS 的 streamSettings 中 tlsSettings 物件示意,並非完整節點設定,也不適用於 REALITY。serverName 必須替換成伺服器要求的實際網域,不要將範例直接套用到所有節點。

{
  "serverName": "example.com",
  "allowInsecure": false
}
  • 略過驗證後若連線恢復,只能表示憑證驗證值得繼續檢查,無法據此確認根本原因是時間、名稱還是信任鏈。
  • 若啟用後仍然逾時,請回頭檢查連接埠與握手階段;反覆切換這個選項,無法修復無法連線的遠端服務。
  • 修正完成後,確認節點編輯頁面的「允許不安全連線」已關閉,再中斷並重新連線測試。

常見問題:如何確認問題已真正解決

時間同步成功了,為什麼仍顯示憑證過期?

先確認新日誌是本次連線產生的,再查看伺服器實際回傳憑證的有效期間。若裝置時間正確但憑證已過期,就需要由伺服器續約並重新載入憑證;只重新啟動用戶端不會改變遠端傳送的憑證。

位址填 IP、SNI 填網域可以嗎?

可以,但該 IP 與連接埠必須提供對應網域的 TLS 服務,憑證也必須涵蓋該網域。雙擊節點確認「位址」「連接埠」「SNI」三項,不要為了讓欄位看起來一致,就把 SNI 改成 IP。

網頁能開啟,用戶端卻顯示 unknown authority?

先比對連線位址、連接埠與 SNI,再檢查伺服器是否傳送完整的中繼憑證鏈。瀏覽器與代理核心可能使用不同的信任庫或憑證鏈處理方式;瀏覽器能正常開啟,不代表用戶端一定能通過驗證。

更新訂閱後 SNI 又被改回去,該怎麼辦?

複製節點進行暫時測試,記下有效欄位,並回報訂閱提供者修正來源設定。來源設定正式修正後再更新訂閱,確認 SNI、指紋與驗證選項,接著使用同一節點重新送出請求,不要依據舊連線判斷結果。

日誌不再顯示 TLS 錯誤,但網頁仍無法開啟?

接著檢查代理協定驗證、路由分流、DNS 與系統代理入口。憑證驗證通過只代表 TLS 這一層已完成,不代表 VMess 或 VLESS 驗證、目標網站連線與應用程式代理設定都正確。

最後依序確認:系統時間正確、節點欄位與伺服器設定一致、憑證驗證保持啟用;重新連線後日誌沒有新的 TLS 驗證錯誤,接著確認應用程式請求經由預期的出口。記下這次修改的欄位名稱與結果,下次更新訂閱或更換核心時即可逐項比對。

v2rayN 下載入口