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

整理 TLS 憑證錯誤的常見原因:裝置時間不同步、SNI 與偽裝網域不符、憑證鏈不完整,並說明 allowInsecure 的風險與正確用法。

本文重點

適用於 v2rayN 連線一般 TLS 節點時,遇到憑證過期、網域不符或未知簽發者的情況。先區分訂閱下載錯誤與節點握手錯誤,再依序檢查系統時間、伺服器名稱和伺服器端憑證鏈;最後說明如何維持 allowInsecure 關閉並確認修復結果。使用 REALITY 的節點應核對相應驗證參數,不適用一般憑證鏈的排查方式。

先判斷錯誤來自訂閱還是節點連線

看到 TLS 錯誤時,先記下觸發錯誤的操作。按下更新訂閱時出現 HTTPS 憑證錯誤,通常是訂閱網址的連線問題;選取節點並瀏覽網頁時,核心日誌中的握手錯誤才可能來自代理節點。兩種連線的目標網域不同,修改節點的 SNI 無法修復訂閱網站的憑證。

解析目標位址 TCP 連線 TLS 握手 憑證驗證 代理協定驗證

一般 TLS 代理連線可依這個流程理解。TCP 連接埠能連線,只能證明有服務回應,無法證明憑證正確、代理驗證成功或網頁能正常開啟。VMess、VLESS 是代理協定,TLS 則是可搭配使用的傳輸安全層,並非每個節點都使用 TLS。

依據錯誤訊息判斷檢查方向

不同核心與版本可能會在錯誤訊息外層附加連線資訊。優先查看最內層的 x509 或 tls 原因,不要只因外層顯示「連線失敗」就反覆重新啟動用戶端。以下是常見的英文錯誤訊息,實際日誌可能還會附上憑證日期或具體網域。

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

原因:本機時間不在憑證有效期限內,可能是裝置時鐘錯誤,也可能是伺服器端憑證已過期。

解決方式:先同步系統時間,再核對憑證的生效與到期時間;確認憑證過期後,請伺服器管理者更新憑證並重新載入服務。

錯誤:x509: certificate signed by unknown authority

原因:無法建立通往受信任根憑證的憑證鏈,常見原因包括缺少中繼憑證、使用自簽憑證或信任存放區異常。

解決方式:先檢查伺服器端傳送的憑證鏈,再檢查裝置的信任存放區;不要從不明來源安裝根憑證。

錯誤:x509: certificate is valid for example.com, not www.example.com

原因:用於驗證的伺服器名稱不在憑證允許的網域範圍內;這裡的網域僅為格式範例。

解決方式:核對節點服務提供者提供的 SNI 和憑證 SAN,不要隨意加上或移除 www。

錯誤:remote error: tls: handshake failure

原因:對端中止握手,可能與 SNI、TLS 參數、用戶端驗證要求或伺服器端策略有關,不能直接判定為憑證不受信任。

解決方式:核對連線參數並搭配伺服器端日誌找出原因;單獨開啟略過驗證,通常無法解決對端拒絕握手的問題。

校準系統時間,再確認憑證是否過期

TLS 驗證依據的是實際時間。只調整工作列顯示的時區,無法確保裝置時鐘正確;反之,時區顯示不同也不一定會造成憑證驗證失敗。從睡眠狀態恢復、主機板電池異常或手動調整日期,都可能讓時鐘不準。

  1. 確認日期

    在 Windows 11 開啟「設定」→「時間與語言」→「日期與時間」,先確認年、月、日,特別留意年份是否有誤。

  2. 同步時鐘

    開啟「自動設定時間」,再於「其他設定」下方按一下「立即同步」。如果同步失敗,先處理網路或時間服務問題;不要把「已開啟自動設定」當成同步成功。

  3. 重新測試連線

    返回 v2rayN,重新啟用目前使用的節點並送出一次連線要求,查看最新時間戳記的日誌,避免依據舊錯誤判斷修復結果。

  4. 確認有效期限

    若仍顯示憑證過期,請檢查憑證的 notBefore 與 notAfter。若裝置時間正確,但已超出憑證有效期限,請交由伺服器管理者更新憑證。

Android 裝置可在系統設定中搜尋「日期和時間」,開啟自動設定時間後,再試用 v2rayNG 或 v2flyNG。各裝置的選單位置不同,重點是確認同步後的實際日期,而不只是切換開關。不要長期將系統日期調回憑證有效期限內來解決問題。

核對 SNI、連線位址與傳輸 Host

SNI 是 TLS 握手時告知伺服器的名稱,伺服器可據此選擇憑證。一般 TLS 設定中的 serverName 通常也用來指定憑證驗證時的目標名稱。「偽裝網域」容易造成混淆:它可能指 TLS 的 SNI,也可能指 WebSocket 的 Host,修改前應先確認實際欄位。

欄位用途檢查重點
伺服器位址決定要連線的遠端主機確認網域或 IP 是否指向正確入口
伺服器連接埠決定要連線的遠端服務與服務提供者的設定一致,例如 443
SNI / serverName影響 TLS 名稱選擇與驗證確認與目標服務及憑證 SAN 相符
WebSocket Host影響 HTTP 要求的虛擬主機路由不是一般 TLS 的憑證驗證開關
WebSocket 路徑符合伺服器端的傳輸入口路徑錯誤可能會顯示 HTTP 狀態碼錯誤

在 v2rayN 主畫面按兩下目標節點,開啟節點編輯視窗,先確認「位址」「連接埠」,再檢查 TLS 區域中的 SNI 與略過憑證驗證選項;實際標籤可能因介面版本而略有不同。不要在「設定」→「參數設定」中修改全域選項,取代核對這個節點的參數。

以 IP 作為連線位址時,通常仍需填入服務提供者指定的網域作為 SNI。若直接使用 IP 驗證憑證,憑證必須包含相應的 IP 類型 SAN;只包含網域的憑證並不符合此要求。萬用字元也有使用限制,*.example.com 通常不涵蓋 example.com 或 a.b.example.com。

判斷方式:不要隨意將網頁網域填入 SNI

先向節點服務提供者確認伺服器名稱,再與憑證 SAN 比對。網頁能開啟,不代表相同網域也能作為代理節點的 SNI;HTTP Host 正確也不能取代 TLS 名稱驗證。

檢查完整憑證鏈與伺服器實際傳回的憑證

伺服器通常必須傳送葉憑證及必要的中繼憑證;根憑證則通常由用戶端的信任存放區提供。只設定葉憑證可能在某些環境中可用,換到另一台裝置卻出現未知簽發者錯誤。瀏覽器可能已快取中繼憑證,因此「瀏覽器能正常開啟」不能單獨證明伺服器憑證鏈完整。

如果你管理自己的伺服器,可在已安裝 OpenSSL 的環境中執行以下命令。example.com 是保留的範例網域;執行前請將兩處名稱換成實際 TLS 網域,並將連接埠換成實際節點使用的連接埠。此命令檢查一般 TLS 入口,不會驗證後續的 VMess 或 VLESS 驗證。

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

認識 allowInsecure:維持驗證,不用開關掩蓋問題

allowInsecure 用來控制是否略過一般 TLS 憑證驗證。設為 true 後,連線可能仍有加密,但伺服器身分不再受到正常的憑證信任鏈與名稱驗證保障;這不代表憑證問題已修復,也無法保證連線至預期的伺服器。

以下僅為一般 TLS 出站設定中的 tlsSettings 欄位片段,並非可直接匯入的完整節點。範例網域必須換成實際伺服器名稱;透過訂閱管理的節點應優先修正來源設定,避免下次更新時覆蓋本機修改。

{
  "tlsSettings": {
    "serverName": "example.com",
    "allowInsecure": false
  }
}

確認修復:恢復驗證後再測試

將 allowInsecure 維持為 false,重新連線並確認不再出現憑證錯誤,再測試網頁連線與預期的出口。若只有開啟略過驗證才能使用,代表問題尚未修復。

常見問題與修復後的再次測試

更新訂閱時出現憑證錯誤,也要修改節點 SNI 嗎?

不應先修改節點。請檢查訂閱網址的網域、裝置時間,以及該 HTTPS 服務的憑證。如果更新操作明確是透過代理進行,請分別測試代理連線與訂閱網站,確認是哪一層發生問題。

電腦能用,Android 卻顯示憑證不受信任,該怎麼辦?

先比較兩端的位址、連接埠、SNI 與憑證驗證開關,再檢查 Android 系統時間與系統更新。若參數一致,請優先請管理者檢查是否缺少中繼憑證,不要直接在裝置上安裝來源不明的根憑證。

REALITY 連線失敗,也需要補上中繼憑證嗎?

不要直接套用一般 TLS 的修復流程。先確認節點的安全類型確實是 REALITY,再逐項核對伺服器名稱、公鑰、shortId 等服務提供者要求的參數,以及核心相容性;開啟 allowInsecure 無法取代這些驗證參數。

修改後曾成功連線一次,如何確認已恢復正常?

維持憑證驗證開啟,重新啟動目前的連線並連續送出幾次實際網頁要求。檢查最新日誌是否還有相同錯誤,再確認系統代理或 TUN 的生效範圍;TCP 延遲顯示數值不能取代這些驗證。

最後保留一份簡短紀錄:觸發操作、完整錯誤類型、修改前後的單項設定、再次測試時間與結果。若問題仍在,請將紀錄與已去除敏感資訊的日誌交給伺服器管理者,並明確要求檢查實際入口傳回的憑證,而非只描述「節點不能用」。若需重新檢查代理是否生效,可參考連線測試說明。

下載v2rayN