V2Ray TLS 交握失敗與憑證錯誤:系統時間同步及 SNI 設定排查

遇到 x509 憑證錯誤或 TLS 交握失敗,常見原因包括裝置時間不正確、SNI 與偽裝網域不符,以及 allowInsecure 設定不當。本文依序說明檢查方式與各用戶端的設定位置。

本文重點

適用於已匯入設定,但連線記錄出現 TLS 或 x509 錯誤的使用者。先確認錯誤是來自訂閱請求還是節點連線,再同步系統時間、核對伺服器位址、SNI 與憑證網域,最後檢查憑證鏈和伺服器入口。每次只修改一個欄位,並保持憑證驗證開啟,才能判斷哪些修改確實有效。

先確認錯誤位置與交握階段

「TLS 交握失敗」是結果,並非唯一原因。訂閱網址使用 HTTPS 時,更新訂閱也會進行 TLS 交握;節點啟用 TLS 時,代理核心也會與節點伺服器交握。前者失敗時應檢查訂閱網域與訂閱服務,後者失敗才需要檢查節點的 SNI。不要只因錯誤訊息有相同關鍵字,就同時修改兩處設定。

先停止連線,記下觸發錯誤的操作,再啟動連線並送出一次網頁請求。v2rayNG 和 v2flyNG 可從主畫面的側邊選單開啟「記錄」查看;v2rayN 則可查看主畫面的記錄區。各版本介面用詞可能略有不同,請保留錯誤訊息前後幾行、目標網域和連接埠,不要只截取「連線失敗」。分享記錄前,請隱藏訂閱網址、使用者識別資訊與憑證。

x509: certificate has expired or is not yet valid

原因:目前裝置時間不在憑證有效期間內,或伺服器憑證確實已過期。解決方式:先同步裝置時間,再檢查憑證的生效與到期日期;若時間正確但仍出現錯誤,請伺服器管理者更新憑證並重新載入。

x509: certificate signed by unknown authority

原因:憑證鏈無法連結至目前環境信任的根憑證,可能缺少中繼憑證,也可能使用了私有憑證。解決方式:檢查伺服器提供的完整憑證鏈及裝置的信任存放區,不要直接略過驗證。

remote error: tls: handshake failure

原因:遠端中止交握,可能與 SNI、TLS 參數、用戶端憑證要求或入口設定有關。解決方式:先核對訂閱中的原始參數,再參考伺服器記錄判斷原因;不能只憑這一行錯誤就認定憑證已過期。

如果記錄中只有 i/o timeout、connection refused 或 EOF,還不能證明發生憑證驗證錯誤。請先確認伺服器位址能否解析、目標連接埠是否可連線,以及該連接埠是否確實提供 TLS。本文後續步驟適用於明確啟用一般 TLS 的連線;REALITY 的參數與驗證方式不同,請勿直接套用。

同步系統時間:先排除憑證有效期間判斷錯誤

憑證會標示生效時間與到期時間。裝置日期若設定在未來,可能會把有效憑證判定為已過期;若設定在過去,則可能判定為尚未生效。只看時鐘上的時分並不足夠,還要確認年份、日期,以及自動時間同步是否正常。時區顯示不同不一定會造成錯誤,驗證時真正採用的是系統所代表的實際時間。

  1. 找到時間設定

    Android 請前往「設定」→「系統」→「日期與時間」。部分裝置的選項位於「更多設定」或「一般管理」,也可以在設定搜尋欄搜尋「日期與時間」。

  2. 開啟自動同步

    開啟「自動設定時間」與「自動設定時區」,並等待網路校時完成。如果日期仍不正確,請先檢查裝置網路與系統時間服務,不要在日期錯誤時反覆測試節點。

  3. 確認電腦時間

    Windows 請前往「設定」→「時間與語言」→「日期與時間」,開啟自動設定時間並點選「立即同步」。macOS 請前往「系統設定」→「一般」→「日期與時間」,開啟自動設定日期與時間。

  4. 重新連線並保留記錄

    停止用戶端連線後重新啟動,再開啟相同網頁。如果仍出現有效期間錯誤,請記下記錄中的目前時間與憑證有效期間,交由節點維護者確認憑證更新狀態。

Linux 可使用 timedatectl status 查看系統時間與同步狀態;使用 systemd 的系統可透過 sudo timedatectl set-ntp true 啟用網路校時。此命令不適用於所有發行版;若系統已使用其他時間同步服務,請依系統設定處理,避免同時啟用互相衝突的校時服務。

SNI、伺服器位址與偽裝網域有何不同

伺服器位址決定要連線至哪個 IP 或網域,連接埠則決定要連線至哪個監聽入口。SNI 是 TLS 交握時傳送的伺服器名稱,伺服器可能依此選擇憑證或後端網站;用戶端通常也會用設定的伺服器名稱驗證憑證名稱。SNI 應填寫純網域名稱,不要加上 https://、連接埠或路徑。

教學中所說的「偽裝網域」不一定指同一個欄位。WebSocket 的 Host、HTTP 請求路徑與 TLS 的 SNI 分屬不同層。依伺服器設計,這些欄位可能使用相同網域,也可能不同。Host 填了某個網域,不代表憑證一定涵蓋該網域,更不能把網頁路徑複製到 SNI。

欄位用途檢查重點
伺服器位址建立底層網路連線須與服務提供者指定的入口一致,可以是 IP 或網域名稱
伺服器連接埠選擇遠端監聽服務443 是常見的 TLS 連接埠,但連接埠號碼不能證明服務已啟用 TLS
SNI / serverName傳送 TLS 伺服器名稱,通常也用於名稱驗證須符合伺服器端的預期,且位於憑證 SAN 涵蓋範圍內
Host傳輸層使用 HTTP 時的主機欄位依 WebSocket 等傳輸入口的要求填寫,不能取代 SNI
allowInsecure控制是否略過憑證驗證正常使用時應保持 false,無法藉此修正憑證或網域錯誤

結論:位址是 IP 時,優先檢查 SNI

如果節點連線至 IP,但憑證只涵蓋網域,應將伺服器指定且受憑證涵蓋的網域設為 SNI。不要隨意改用知名網站網域,也不要只為了消除錯誤就把伺服器位址改成憑證網域,否則可能連到完全不同的入口。

名稱是否相符,主要查看憑證的 SAN。萬用字元 *.example.com 通常可匹配 node.example.com,但無法匹配根網域 example.com,也不能匹配 a.node.example.com。此處的網域僅用於說明匹配規則,並非可用節點。

各用戶端的 SNI 與憑證驗證設定位置

先記下節點原有的位址、連接埠、傳輸方式、TLS 類型、SNI 和 Host。訂閱產生的節點可能在下次更新時覆蓋手動修改,建議先複製成獨立的測試設定;若介面沒有複製選項,可先保存原始參數,再手動建立新設定。不同版本顯示的欄位可能是英文或中文,請以欄位意義為準,不要在全域設定中尋找所有節點共用的 SNI。

  1. 檢查 v2rayNG

    在主畫面點選目標節點旁的鉛筆編輯按鈕,進入設定編輯頁。找到 TLS 區域,確認安全類型為 tls,並檢查「SNI」;「略過憑證驗證」或 allowInsecure 應保持關閉。儲存後重新選取該節點,再重新啟動連線。

  2. 檢查 v2rayN

    在伺服器清單中雙擊目標節點,開啟伺服器編輯視窗。在「傳輸層安全性 (TLS)」區域確認 TLS 類型、「SNI」及「略過憑證驗證 (allowInsecure)」。後者應設為 false,儲存後重新設為使用中的伺服器並重新連線。

  3. 檢查 v2flyNG

    在主畫面點選目標設定的編輯按鈕,進入節點設定頁,檢查 TLS 相關欄位中的 serverName 或 SNI,並關閉 allowInsecure。若匯入的是自訂 JSON,請檢查該設定中的 TLS 選項,不要假設一般節點表單會套用至該設定。

  4. 比對原始參數

    逐項比對編輯頁中的內容與服務提供者的設定說明,特別確認更新訂閱後 SNI 是否遺失,以及 TLS 是否誤選成其他安全類型。每次只修正一項,然後儲存、重新連線並查看最新記錄。

v2rayNG 使用 Xray 核心,v2flyNG 使用 v2fly 核心。兩者支援的設定範圍不完全相同;測試時不要直接互換包含特定擴充功能的設定。對於一般 VMess 或 VLESS 的 TLS 連線,請先確認目前核心支援該協定與傳輸方式,再檢查憑證驗證問題。使用者識別資訊錯誤通常也不是修改 SNI 就能解決。

檢查憑證鏈與伺服器入口

時間與 SNI 都正確,但仍出現不受信任錯誤時,應檢查伺服器傳送的憑證鏈。常見原因包括只設定網站憑證,卻漏掉中繼憑證;或是憑證更新檔已更換,但實際處理 TLS 的反向代理尚未重新載入。如果前方還有中繼伺服器或 CDN,請檢查用戶端實際連線的那一層,而不只是來源伺服器上的檔案。

已安裝 OpenSSL 的 macOS 或 Linux 環境可使用以下命令,檢視 TLS 憑證鏈與名稱驗證結果。範例連線至保留作為示範用途的網域,不能用來驗證你的節點;實際排查時,請將連線位址、連接埠及兩處網域換成自己的參數。此命令會建立連線,但不會驗證 VMess、VLESS 認證或後續傳輸路徑。

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

查看輸出中的憑證有效期間、名稱與驗證錯誤。即使顯示 Verify return code: 0 (ok),也只代表這次測試環境的憑證驗證通過,不能證明代理設定整體可用。如果一般 TLS 交握成功,但用戶端仍然失敗,請繼續檢查傳輸路徑、Host、協定認證,以及用戶端實際連線的位址是否相同。

allowInsecure 與常見誤解

allowInsecure=true 會略過重要的憑證驗證,使連線無法可靠確認伺服器身分。它不會更新憑證、不會補齊憑證鏈,也不會自動修正 SNI。即使開啟後暫時可以連線,也只能據此判斷問題可能與驗證有關,不能認定設定已經修好。

關閉憑證驗證後就能連線,可以一直開著嗎?

不建議。請恢復 allowInsecure=false,依序排查時間、名稱與憑證鏈。自行架設私有憑證環境時,應透過受控方式設定信任或憑證鎖定,並確認目前核心支援,而不是長期略過身分驗證。

SNI 留白時,會自動使用伺服器位址嗎?

部分設定會根據位址推導伺服器名稱,但實際行為取決於核心與設定類型。位址是 IP 時,更不能依賴這種推導;請依服務提供者的要求,明確填入憑證涵蓋的網域,再儲存並重新連線。

瀏覽器可以正常開啟網域,為什麼節點仍出現錯誤?

瀏覽器可能連到不同連接埠、不同 IP 或不同入口,使用的信任存放區也可能不同。請先比對節點的連線位址、連接埠與 SNI;網頁可以開啟只代表該次瀏覽器連線成功,不代表節點使用相同的 TLS 路徑。

更新訂閱後又恢復原本的錯誤,該怎麼辦?

比對更新前後的 SNI、TLS 類型與連接埠。請將暫時修改保留在獨立測試設定中,並向服務提供者回報訂閱參數錯誤;不要反覆修改後又更新覆蓋,也不要把錯誤歸咎於路由分流。

節點可以連線,只有更新訂閱時出現 x509 錯誤?

檢查訂閱網址本身的 HTTPS 憑證與系統時間。節點編輯頁中的 SNI 通常不會影響訂閱請求;如果透過代理更新訂閱,也要檢查代理連線路徑,但不要一開始就修改節點的憑證驗證設定。

修復後的重新測試順序

排查完成後,先確認系統時間正常且憑證驗證已開啟,再重新啟動連線。不要只憑延遲測試結果判斷:不同測試方式涵蓋的連線階段不同,有測試結果不代表認證、傳輸與網頁請求都成功。請使用相同節點、相同網路及相同目標進行測試,減少變因。

結論:依據最新記錄決定下一步

修正時間後,若錯誤轉為名稱不符,就繼續檢查 SNI;名稱錯誤消失後若變成傳輸失敗,就進一步排查傳輸層。依據最新的具體錯誤逐步處理,比起同時更換 DNS、連接埠、協定與憑證驗證設定,更容易找出原因。

下載用戶端依平台選擇安裝套件