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

整理 TLS 憑證錯誤的常見原因,包含系統時間不同步、SNI 與憑證網域不符、偽裝網域填錯,並說明各用戶端的檢查位置。

本文重點

適用於節點使用一般 TLS,且用戶端日誌出現握手失敗或 x509 憑證錯誤的情況。依序檢查「日誌原文 → 系統時間 → 連線位址與 SNI → 憑證鏈 → 用戶端欄位」,區分網路逾時與憑證驗證失敗;維持憑證驗證開啟,逐項修改後再從日誌確認結果。

先分辨憑證錯誤與連線失敗

「TLS 握手失敗」描述的是連線階段,並非單一原因。用戶端先連上節點位址與連接埠,再進行 TLS 協商及憑證驗證,之後才會進入代理協定的互動。連線逾時、伺服器主動中斷、憑證網域不符,都可能被上層統稱為連線失敗。排查時應展開核心日誌,查看錯誤鏈最末層,而不是只看測速清單中的失敗標記。

v2rayN 可在主畫面的日誌區查看這次連線記錄;v2rayNG 與 v2flyNG 可從主選單的日誌入口查看。不同版本的選單名稱可能不同。先記下用戶端版本、核心名稱、傳輸方式及完整錯誤,再只對一個節點發出一次請求,避免多個背景連線的日誌混在一起。

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

原因:驗證時間不在憑證有效期限內,可能是裝置時間有誤,也可能是伺服器憑證確實已過期。解法:先同步裝置時間,再對照日誌中的目前時間與憑證有效期限;若仍報錯,請伺服器端更新憑證並重新載入。

錯誤:x509: certificate signed by unknown authority

原因:憑證無法串接至受信任的根憑證,常見原因包括缺少中繼憑證、使用自簽憑證或連線遭到替換。解法:檢查伺服器端的完整憑證鏈及裝置信任存放區,核對簽發者;不要以停用驗證取代修復。

錯誤:tls: first record does not look like a TLS handshake

原因:目標連接埠傳回的不是預期 TLS 資料,可能連到了明文服務。解法:核對節點連接埠、傳輸安全設定及反向代理的監聽設定。

錯誤:context deadline exceeded

原因:操作超過時限,單看這行無法判定憑證有問題。解法:搭配前後日誌檢查網域解析、TCP 是否可連,以及目前的握手階段;先不要修改憑證選項。

系統時間:先同步,再判斷憑證是否過期

憑證包含生效時間與到期時間。裝置時鐘太早可能觸發「尚未生效」,太晚則可能顯示「已過期」。只切換時區通常不會改變實際的系統時間戳;需要校正的是實際日期與時間。雙系統切換、長時間關機後開機,或自動時間同步失敗,都應優先檢查。

  1. 同步時間

    Windows 11:開啟「設定」→「時間與語言」→「日期與時間」,啟用「自動設定時間」,再於「其他設定」中點選「立即同步」。若同步失敗,請先確認裝置網路連線正常。

  2. 確認其他裝置

    macOS:前往「系統設定」→「一般」→「日期與時間」,啟用自動設定日期與時間。Android:前往系統「設定」→「系統」→「日期與時間」,啟用自動設定時間;部分廠牌的系統會將此選項放在「更多設定」。

  3. 重新建立連線

    同步時間後,停止並重新啟動用戶端連線,記錄新產生的錯誤。不要用校正時間前的舊日誌判斷修復是否有效。

  4. 檢查憑證期限

    若裝置時間正確,仍提示憑證過期,請檢查實際收到的憑證有效期限。憑證更新後,還需要讓 TLS 終止服務重新載入;磁碟上的新檔案不代表目前連線已使用新憑證。

連線位址、SNI 與 Host 不可混為一談

節點編輯頁中的「位址」決定連線目標;SNI 是 TLS ClientHello 中送出的伺服器名稱,伺服器常依此選擇憑證;WebSocket 的 Host 則屬於握手後的 HTTP 要求標頭。三者可能使用相同網域,也可能不同,但必須符合伺服器設定,不能把「偽裝網域」當成可任意更換的裝飾欄位。

設定項目作用階段檢查重點
位址與連接埠建立網路連線使用伺服器提供的入口;網域解析結果應指向預期服務。
serverName / SNITLS 握手填入憑證涵蓋的伺服器名稱,不含通訊協定、連接埠或路徑。
WebSocket HostHTTP 升級要求符合反向代理的虛擬主機設定;不能取代 TLS 的 SNI。
WebSocket pathHTTP 路徑比對使用伺服器指定的路徑;路徑錯誤通常不是憑證網域錯誤。
allowInsecure憑證驗證一般公開憑證情境請維持 false。

以保留供文件說明的網域 edge.example.com 為例:如果憑證的 Subject Alternative Name 包含此名稱,SNI 就應填入這個主機名稱,而不是 https://edge.example.com/path。透過 IP 連線時,也可以明確指定伺服器要求的網域作為 SNI。若直接以 IP 驗證,憑證必須包含相符的 IP 位址項目,只有網域項目並不足夠。

443
HTTPS 常用連接埠,並非所有節點都固定使用
80
明文 HTTP 常用連接埠,不應因此自動啟用 TLS

判斷方式:依伺服器參數核對,不要用連接埠猜測協定

連接埠號碼只是慣例。先確認節點實際啟用了標準 TLS,再核對 SNI 與憑證網域;只修改 WebSocket Host,無法修正發生在 HTTP 要求之前的憑證名稱錯誤。

用戶端中 SNI 與 allowInsecure 的檢查位置

介面名稱會隨版本變動,以下以節點編輯入口及實際欄位作為定位依據。訂閱匯入的參數也可能在更新時被覆寫,修改前建議複製一個節點供排查,並記下原始值。不要在同一次測試中同時修改位址、連接埠、SNI 和傳輸方式,否則即使恢復連線,也難以判斷原因。

以下是一般 TLS 的 streamSettings 設定片段,用來辨識欄位,並非完整節點設定。範例使用 TCP 傳輸,網域僅供說明;現有節點若使用 WebSocket 或其他傳輸方式,不要為了照抄範例而改成 TCP。最終支援的欄位仍以實際執行的核心為準。

{
  "streamSettings": {
    "network": "tcp",
    "security": "tls",
    "tlsSettings": {
      "serverName": "edge.example.com",
      "allowInsecure": false
    }
  }
}

憑證鏈與 SNI:透過獨立握手縮小問題範圍

若環境中有終端機工具,可在同一部裝置、同一個網路下獨立檢視伺服器傳回的憑證。以下指令需在系統已安裝 OpenSSL 的情況下使用;執行前請將範例主機名稱、SNI 與連接埠替換為實際參數。連線位址與 SNI 分開指定,特別適合檢查「透過 IP 連線、以網域驗證」的設定。

openssl s_client -connect edge.example.com:443 -servername edge.example.com -showcerts -verify_hostname edge.example.com -verify_return_error

若只有在某個網路中收到簽發者不同的憑證,請檢查該網路是否有 HTTPS 檢查、入口網站登入或流量轉送。不要從錯誤彈出視窗中任意安裝未知的根憑證。若伺服器由他人管理,提供去識別化的錯誤末行、發生時間、SNI 與連接埠即可;不要附上完整訂閱網址、UUID 或其他憑證資料。

常見問題與修復後驗收

開啟 allowInsecure 就能連線,可以一直開著嗎?

這只能表示一般憑證驗證環節值得優先檢查,不代表已確認問題出在網域。請同步時間,核對 SNI、憑證有效期限及完整憑證鏈;修復後關閉此選項,再實際發出要求確認。

瀏覽器能開啟節點網域,為什麼用戶端仍然報錯?

先核對兩者是否連到相同位址、連接埠與 SNI。瀏覽器可能使用不同代理,或解析至不同入口,所使用的信任存放區也可能不同。請以用戶端實際連線及收到的憑證為準。

訂閱更新後 SNI 又還原了,該怎麼辦?

保留獨立的測試副本,確認修改確實有效後,聯絡訂閱提供者修正下發參數。每次更新後都核對原節點,避免把自動覆寫誤認為用戶端沒有儲存設定。

節點使用 REALITY,也要檢查這些 TLS 項目嗎?

先確認 security 的實際值。REALITY 不能直接套用一般 TLS 的憑證修復流程,應核對伺服器要求的 serverName、公鑰和 shortId 等對應參數;不要改成一般 TLS,也不要為了碰運氣而啟用略過驗證。

修改完成後,先儲存節點並重新啟動連線,再用相同的要求重新測試。驗收時不能只看延遲數字:日誌中不應再出現原本的憑證錯誤,實際要求也應能完成;一般 TLS 節點仍須維持憑證驗證開啟。若握手通過後出現路徑錯誤、HTTP 狀態碼異常或協定驗證失敗,應改查傳輸路徑與帳戶參數,不要再反覆修改 SNI。

下載用戶端