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

整理用戶常遇到的憑證無效、握手失敗等問題,逐一檢查系統時間同步、SNI 與偽裝網域設定、指紋參數,以及略過憑證驗證的風險。

本文重點

適合使用 v2rayN、v2rayNG 或 v2flyNG,遇到 TLS 握手失敗、憑證過期或網域不符的用戶。先判斷錯誤來自更新訂閱還是連線至節點,再依序檢查時間、位址與連接埠、SNI、憑證鏈及傳輸參數。看完後即可判斷哪些設定能在用戶端修正、哪些須由節點維護者處理,以及為何不該把 allowInsecure 當成日常連線方案。

先確認 TLS 錯誤來自哪一種連線

「握手失敗」是連線結果,不代表原因只有一種。一般 TLS 連線會先解析伺服器位址、建立 TCP 連線,再協商 TLS 參數並驗證憑證;代理協定驗證與實際轉送通常在之後才發生。網域解析失敗、443 連接埠無法連線,或協定驗證遭拒,都可能讓用戶端顯示連線失敗,但這些問題無法靠修改憑證設定解決。

位址解析 連接埠連線 TLS 協商 憑證驗證 協定驗證 轉送請求

先確認錯誤是在什麼操作後出現。按下「更新訂閱」後出現憑證錯誤,表示問題涉及訂閱伺服器的 HTTPS 連線;選取節點後瀏覽網頁,且核心日誌出現 x509,才可能是代理出站連線的 TLS 驗證失敗。節點編輯頁的 allowInsecure 通常不會影響下載訂閱時使用的 HTTPS 驗證。

依錯誤原文判斷排查方向

不同核心與版本可能會在原始錯誤前後加入連線資訊。以下列出常見的核心錯誤訊息,不必與整行日誌完全一致。這些訊息有助於縮小排查範圍,但單一錯誤通常不足以證明最終原因。

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

原因與解法:裝置時間不在憑證有效期限內,或伺服器憑證確實已過期。先同步系統時間;若時間正確但問題依舊,請維護者檢查憑證有效期限,以及續期後是否重新載入服務。

錯誤:x509: certificate is valid for edge.example, not node.example

原因與解法:用戶端驗證的名稱不在憑證涵蓋範圍內。確認伺服器要求的 SNI 與憑證 SAN;不要只因連線位址是 node.example,就把 SNI 也設成該位址。

錯誤:x509: certificate signed by unknown authority

原因與解法:無法建立信任鏈,可能是缺少中繼憑證、使用自簽憑證、信任憑證庫過舊,或網路中有人替換憑證。比較不同裝置與網路的結果,再檢查伺服器是否提供完整憑證鏈。

錯誤:remote error: tls: handshake failure

原因與解法:對端拒絕 TLS 握手,可能與 SNI、協定版本、用戶端指紋或伺服器策略有關。依原始節點設定逐項還原參數,不要直接判定是憑證過期。

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

原因與解法:目標連接埠回傳的不是 TLS 資料。確認連接埠與 TLS 開關設定,例如提供明文 HTTP 的 80 連接埠,不應當成 TLS 服務使用的 443 連接埠。

EOF、connection reset by peer 與 i/o timeout 涵蓋的原因更廣,可能是連線中斷、防火牆、連接埠錯誤或伺服器無法使用。不能只看到這些字樣就略過憑證驗證。先確認 TCP 連線能否建立,再檢查 TLS 層。

檢查系統時間與節點參數的五個步驟

每次只修改一個變數,並重複相同的測試請求。先儲存原始設定,避免同時更改位址、連接埠、SNI 和指紋;否則即使最後連線成功,也無法確認是哪項設定解決問題。以下 Windows 操作路徑以 Windows 11 中文介面為例;不同桌面介面與版本的欄位位置可能不同,但欄位意義相同。

  1. 同步時間

    在 Windows 開啟「設定」→「時間和語言」→「日期和時間」,啟用「自動設定時間」,再按一下「立即同步」。Android 通常可在「設定」→「系統」→「日期和時間」啟用自動設定時間;部分廠牌可能將選項放在「更多設定」中。請核對實際日期與時間,不要只看時區名稱。

  2. 確認連接埠

    在 v2rayN 主畫面按兩下目前使用的節點,開啟編輯頁;在 v2rayNG 節點清單中,點選對應節點的編輯圖示。對照節點服務提供者提供的「位址」和「連接埠」。TLS 常用 443,但節點使用 8443 或其他連接埠也很正常,不要一看到憑證錯誤就一律改成 443。

  3. 檢查 SNI

    在節點編輯頁的 TLS 或傳輸安全區域,確認「SNI」或「serverName」欄位。填入伺服器要求的網域,不要加上 https://、連接埠、路徑或空格。連線位址與 SNI 可以不同,請勿以猜測取代節點參數。

  4. 恢復驗證

    確認「允許不安全的連線」或「allowInsecure」已關閉;正常使用時應為 false。同時還原服務提供者要求的指紋與 ALPN;若原始設定沒有這些值,不要為了消除錯誤而任意新增。

  5. 重新連線並查看日誌

    儲存節點並重新啟動連線。v2rayNG 可先停止再重新啟動連線;v2rayN 儲存後,確認目前選取的是修改過的節點,再重新測試。記錄錯誤是否從憑證錯誤變成連線逾時或協定驗證錯誤;這表示失敗的階段已經改變。

憑證驗證依據的是實際時間點。只調整顯示的時區、卻不修正錯誤的系統時鐘,通常無法解決有效期限問題。例如系統日期停留在 2025 年,但憑證要到 2026 年才生效,就會顯示「尚未生效」;反過來,系統日期被設到未來,也可能讓仍有效的憑證被判定為過期。

# Linux:查看系統時間與同步狀態
timedatectl status

# Linux:啟用系統支援的網路時間同步,通常需要管理員權限
sudo timedatectl set-ntp true

Linux 的第二個指令須仰賴系統已提供可用的時間同步服務;設定後仍應再次查看同步狀態。macOS 可在「系統設定」→「一般」→「日期與時間」檢查是否啟用自動設定。若時間準確且只有一個節點報錯,就不必反覆調整裝置時間,應改查伺服器憑證與節點參數。

SNI、連線位址與 Host 並非同一個欄位

SNI 是 TLS 握手時用戶端傳給伺服器的名稱,常用於選擇虛擬網站與憑證。一般 TLS 設定中的 serverName 通常也用來指定憑證驗證名稱。連線位址用來找到伺服器,HTTP Host 則屬於較上層的 HTTP 請求。這三者可能相同,也可能要依服務部署需求分別填寫。

欄位作用階段填寫依據常見錯誤
位址與連接埠解析並建立連線節點實際入口,例如 443 或 8443把訂閱網站位址當成節點位址
SNI / serverNameTLS 握手與名稱驗證伺服器允許的名稱與憑證 SAN加上協定前綴、路徑,或任意更換網域
WebSocket HostHTTP 升級請求反向代理的虛擬主機設定以為修改 Host 就會自動修正 SNI
WebSocket path比對請求路徑伺服器設定的路徑路徑錯誤卻只檢查憑證

例如,入口位址是 node.example,而伺服器要求的 SNI 是 edge.example,連線仍會送往入口位址,但一般 TLS 憑證應涵蓋 edge.example。本文中的 .example 網域僅為保留網域示例,不是可用的節點。若直接使用 IP 連線,卻未設定正確的驗證名稱,而憑證只涵蓋網域,就可能發生名稱不符。

結論:先核對欄位,再更改網域

遇到名稱不符時,先向維護者確認位址、SNI 和 HTTP Host 各自應使用的值。只有憑證實際涵蓋、且伺服器接受的名稱才有效;換成知名網站的網域,無法修復一般 TLS 設定。

所謂「偽裝網域」並不是統一的技術欄位。有些設定用它表示 SNI,有些指 HTTP Host,也有些涉及 REALITY 的伺服器名稱。必須先確認傳輸安全方式:一般 TLS 的 CA 憑證驗證,與 REALITY 使用的驗證參數,並非同一套排查流程。

檢查憑證鏈、指紋與傳輸參數

瀏覽器能開啟同一個網域,不代表代理節點的 TLS 設定一定正確。瀏覽器可能連到 443,而節點連到 8443;兩次連線也可能使用不同的 SNI、入口位址或信任憑證庫。必須比對相同的入口與名稱,才有診斷價值。

若裝置已安裝 OpenSSL,可使用以下指令檢查一般 TLS 入口。範例採用保留網域,請先依自己的入口與 SNI 修改,再執行;這不是代理協定測試,也無法用來驗證 REALITY 節點是否可用。

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

-connect 用來指定連線目標,-servername 用來傳送 SNI,-verify_hostname 則會明確驗證名稱。只傳送 SNI 不代表已執行網域比對驗證。請查看憑證有效期限、名稱與驗證結果;工具使用的信任憑證庫也可能與用戶端不同,因此結果只能做為排查線索,不能當成唯一結論。

為什麼不該長期啟用 allowInsecure

在常見的 V2Ray/Xray 一般 TLS 設定中,allowInsecure: true 會略過正常的伺服器憑證鏈與名稱驗證。連線仍可能經過加密,但用戶端將無法可靠確認連線對象的身分。傳輸經過加密,不代表加密通訊的另一端就是預期的伺服器。

問題啟用後可能改善嗎正確處理方式
憑證過期或名稱不符可能略過驗證錯誤修正時間與 SNI,或更新伺服器憑證
自簽憑證不受信任可能略過信任鏈錯誤依受控環境需求設定可信憑證或受支援的信任方案
連接埠無法連線、連線逾時無法修復網路連線問題確認連接埠、網路與服務狀態
路徑或驗證參數錯誤無法修復上層協定設定還原正確路徑與節點憑證
REALITY 驗證失敗無法取代 REALITY 的驗證流程確認 REALITY 專用參數與核心支援

若為受控診斷而暫時啟用後便能連線,只能表示憑證驗證很可能是失敗原因之一,無法證明節點安全或所有問題都已解決。診斷期間不要傳送敏感資料,完成後立即關閉,並依原始錯誤修正具體原因。較穩妥的做法是先透過日誌與憑證檢查找出問題,不要長期略過驗證,只為了「連得上」。

結論:恢復驗證後才算修復

將 allowInsecure 還原為 false,再使用同一個節點重新連線。若仍然報錯,就繼續修正時間、名稱或信任鏈;只有正常通過驗證且實際請求成功,這次憑證問題才算排除。

常見問題與故障資訊整理

電腦可以連線,Android 為什麼顯示憑證不受信任?

先讓兩台裝置使用相同的節點、SNI 與網路,並確認已啟用自動設定時間。若參數一致,請檢查系統信任憑證庫的差異,以及伺服器是否漏傳中繼憑證;不要直接照搬電腦上略過驗證的設定。

更新訂閱後突然握手失敗,需要重新安裝嗎?

先在節點編輯頁比對位址、連接埠、TLS 類型與 SNI 是否有變化,並確認選取的是新節點而非舊副本。重新安裝通常無法修復伺服器憑證過期;請先保存錯誤原文,再聯絡維護者確認設定。

為什麼換成手機熱點就正常了?

這表示網路路徑可能影響連線,但還不能直接判定原因。保持節點參數不變,分別記錄兩種網路下的錯誤;若異常網路顯示未知簽發機構,請檢查是否有 HTTPS 檢查或憑證替換,不要盲目信任來路不明的根憑證。

延遲測試通過,就代表憑證正常嗎?

不一定。TCP 延遲測試只代表連接埠連線成功,不一定有執行 TLS 驗證或代理請求。先確認測試類型,再實際發出請求並查看核心日誌;不要把單一延遲數值當成完整的連線驗收結果。

憑證已續期,為什麼用戶端仍顯示過期?

請維護者確認服務是否已重新載入新憑證,以及不同入口是否仍提供舊憑證。用戶端也應確認時間與入口位址;多台伺服器或 IPv4、IPv6 入口設定不一致,也可能造成只有部分連線失敗。

若需要進一步協助,只需提供能重現問題的最少資訊。不必貼出整份設定檔,更不要把訂閱網址放進故障截圖。可參考以下清單整理資訊,再前往本站的故障排除繼續排查;若不清楚欄位意義,可查閱概念速查。

下載v2rayN