V2Ray TLS 握手失敗、憑證錯誤排查:系統時間與 SNI 設定常見問題

整理 v2rayN、v2rayNG 等用戶常遇到的 TLS 握手失敗與憑證無效問題,說明系統時間、SNI、憑證鏈及略過驗證設定的檢查方式。

本文重點

適用於 v2rayN、v2rayNG 與 v2flyNG 中啟用一般 TLS 的節點。先保留核心日誌中的錯誤訊息,再依序檢查系統時間、伺服器位址與 SNI、憑證鏈及傳輸參數。閱讀本文後,可判斷問題出在本機設定或伺服器憑證,並整理資料供服務維護人員查核;不建議以關閉憑證驗證作為修復方式。

一、先查看完整日誌,確認問題發生在哪個階段

「TLS 握手失敗」只表示問題範圍,並非單一原因。一般連線會先解析伺服器位址、建立 TCP 連線,再進行 TLS 協商與憑證驗證,之後才進入代理協定及上層傳輸。VMess、VLESS 是代理協定名稱,不能只憑協定名稱判斷憑證是否正確。

解析位址 連接埠 TLS 協商 憑證驗證 代理通訊

在 v2rayN 主視窗查看日誌區域;必要時進入「設定」→「參數設定」,找到核心日誌等級並暫時設為 info。不同版本的選項位置與名稱可能略有差異。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 資料,常見原因是連接埠或服務類型設定錯誤。請依訂閱服務提供的位址、連接埠與 TLS 設定逐一確認,不能只把連接埠改成 443 就當作修復完成。

日誌中的 i/o timeout、connection refused 或 EOF,都不能單獨證明憑證有問題。前兩種情況應先檢查網路是否可連線,以及服務是否正在監聽;單獨出現 EOF 代表連線提早結束,仍須配合伺服器日誌查明原因。提供日誌給他人時,請遮蔽訂閱連結、用戶識別資訊與存取權杖。

二、系統時間不準:先同步時間,再確認憑證是否過期

憑證包含生效時間與到期時間。系統日期若錯了一年,會直接超出有效期限;即使只差幾分鐘,在憑證剛簽發或即將到期時也可能驗證失敗。時區顯示不同不一定代表時鐘錯誤,應確認裝置記錄的實際時間是否準確,而非只看時區名稱。

  1. Windows:開啟「設定」→「時間與語言」→「日期與時間」,啟用自動設定時間,再按一下「立即同步」。確認日期、年份與時區後,重新啟動用戶端核心。
  2. macOS:開啟「系統設定」→「一般」→「日期與時間」,啟用自動設定日期與時間。裝置從長時間休眠恢復後,也應重新確認目前時間。
  3. Android:在系統設定中搜尋「日期與時間」,啟用自動設定時間與自動設定時區。確認網路連線正常後,返回 v2rayNG 或 v2flyNG 重試同一個節點。
  4. Linux:使用 timedatectl status 查看時鐘同步狀態;使用 systemd 的系統可透過 sudo timedatectl set-ntp true 啟用網路時間同步。

Windows 可先在終端機查詢同步狀態。第二個指令須以系統管理員身分執行;若同步失敗,請依系統提示檢查時間服務與網路,不要連續更改節點參數。

w32tm /query /status
w32tm /resync
443
HTTPS 常用 TCP 連接埠
80
HTTP 常用 TCP 連接埠
123
NTP 常用 UDP 連接埠

以上是各協定常用的連接埠,不代表你的節點一定要使用其中某個連接埠。網路封鎖 UDP 123 可能影響傳統 NTP 時間同步,但不能因此推斷代理連接埠也遭到封鎖。若系統時間正確,日誌仍明確顯示憑證過期,應由伺服器端更新並重新載入憑證;修改本機日期無法解決問題。

三、SNI、伺服器位址與 Host:分別確認三個欄位

SNI 是 TLS 握手時傳送的伺服器名稱,讓同一個位址上的服務選擇對應的憑證。v2rayN 節點編輯視窗中的「SNI」或「伺服器名稱」,通常對應核心 TLS 設定中的 serverName。用戶端也會依設定中的伺服器名稱驗證憑證身分,因此不能任意填入看起來能開啟的網站網域。

欄位用途確認方式
伺服器位址決定連線至哪個網域或 IP 位址。須與目前有效的訂閱資料一致,不含通訊協定前綴與路徑。
連接埠決定連線至目標上的哪個服務。依伺服器設定填寫,不要預設為 443。
SNI / serverName用於選擇 TLS 服務及驗證憑證名稱。使用服務提供者指定,且包含在憑證涵蓋範圍內的網域。
WebSocket Host屬於 TLS 建立後的 HTTP 請求標頭。依反向代理設定填寫,不能取代 SNI。
WebSocket 路徑讓反向代理將請求轉送至對應的後端。逐字確認路徑與大小寫,並與憑證網域分開檢查。

例如,伺服器位址可以是 IP,而 SNI 是憑證涵蓋的網域,兩者不一定相同。不過,若以 IP 驗證憑證,憑證的主體替代名稱(SAN)中必須包含對應的 IP 類型項目,只有網域項目並不足夠。一般網域憑證則應檢查 SAN,也就是主體替代名稱,不能只看憑證頁面上的標題。

結論:憑證名稱不符時,先修正 SNI,不要先改 DNS

若日誌已顯示收到的憑證與預期名稱不符,表示連線至少已到達某個 TLS 服務。請先確認 SNI、目標位址與憑證 SAN;只有懷疑解析到錯誤服務時,才需要檢查 DNS 解析結果。

四、憑證鏈不完整:瀏覽器能開啟,不代表核心也能通過驗證

伺服器通常必須傳送網站憑證及必要的中繼憑證,再由用戶端使用自己的信任根完成驗證。瀏覽器可能已快取中繼憑證,或採用不同的信任機制,因此「同一個網域在瀏覽器中能正常開啟」只能作為線索,不能排除伺服器端憑證鏈設定錯誤。

  1. 先確認影響範圍:若同一個節點在多台時間準確的裝置上都顯示未知的憑證簽發者,請優先讓維護人員檢查部署的憑證與中繼憑證。
  2. 再比較裝置差異:若只有舊系統無法連線,請檢查系統更新與信任根狀態,同時記下用戶端及實際使用的核心版本。
  3. 檢查網路介入:若問題只在公司或機構網路,或啟用 HTTPS 檢查的安全軟體環境中出現,請聯絡網路管理員確認是否有憑證替換情況。
  4. 處理私有憑證:只在明確受控的部署環境中,依管理要求設定可信任的憑證;不要匯入來源不明的根憑證。

若具備命令列環境,可使用 OpenSSL 查看伺服器傳回的憑證。以下使用保留的示例網域,只示範指令格式;實際排查時,請分別將兩個網域替換成節點連線位址與預期的 SNI,連接埠也須依節點設定填寫。

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

-servername 用於傳送 SNI,-verify_hostname 用於指定驗證名稱,兩者用途不同。此指令使用的信任存放區可能與用戶端核心不同;若本機 OpenSSL 未正確設定可信任的 CA,指令報錯也不能直接判定為伺服器故障。複查時請著重記錄回傳憑證的 SAN、有效期限與憑證鏈,不要只截取最後一行。

五、略過憑證驗證:保持關閉,修正實際設定

「允許不安全連線」或「略過憑證驗證」通常對應 allowInsecure。啟用後,用戶端可能不再拒絕不受信任或名稱不符的憑證,但這並未修復憑證,連線對象的身分也就無法正常驗證。此設定同樣無法修復 TCP 逾時、連接埠錯誤、WebSocket 路徑錯誤或代理驗證失敗。

以下為一般 TLS 出站設定中 streamSettings 的局部示意,並非可直接匯入的完整設定,也不適用於 REALITY。example.com 僅用於說明欄位關係,實際值必須依伺服器設定填寫,不可直接使用示例網域連線至節點。

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

六、憑證通過後仍無法連線:檢查傳輸層與伺服器端紀錄

憑證驗證成功不代表代理連線已成功。WebSocket 的路徑與 Host、gRPC 的服務名稱,以及代理協定的使用者識別資訊,都會在各自階段參與通訊。若日誌從 x509 錯誤變成 HTTP 狀態錯誤或驗證失敗,應依新錯誤繼續排查,不要再次啟用略過驗證。

錯誤:websocket: bad handshake

原因與解法:WebSocket 升級請求未收到預期回應,可能是 Host、路徑或反向代理轉送設定不一致。請確認節點的傳輸設定,並請維護人員查看對應時間的 HTTP 存取紀錄。

錯誤:remote error: tls: handshake failure

原因與解法:遠端中止 TLS 協商,可能與 SNI 政策、協定相容性或伺服器端驗證要求有關。僅憑用戶端這行訊息無法判定原因,應配合伺服器端握手日誌查核,不能直接歸因於本機憑證存放區。

每次只修改一個欄位,再用同一個節點重試。若同時更換 DNS、SNI、核心與連接埠,即使恢復連線,也很難判斷哪個步驟有效。升級用戶端或核心前請先備份設定,並確認支援節點所需的協定與傳輸類型;不要為了消除某一則錯誤訊息而盲目切換核心。

七、常見問題:依錯誤範圍決定下一步

時間已同步,為什麼還是顯示憑證過期?

先確認錯誤來自剛才重試的節點,而不是舊日誌。檢查用戶端實際收到的憑證有效期限;伺服器端可能已更新憑證檔案,卻未重新載入服務,或只更新了部分入口。請提供失敗時間、連線位址與憑證到期時間,交由維護人員查核。

伺服器位址是 IP,SNI 就一定要填 IP 嗎?

不一定。連線位址決定資料要傳送到哪裡,SNI 通常填入服務提供者指定的憑證網域。若改用 IP 作為驗證名稱,憑證必須包含相符的 IP 類型 SAN。不要將 WebSocket Host 當成可自動取代 SNI 的設定。

啟用略過驗證後能連線,可以一直開著嗎?

這只能表示問題可能與憑證驗證有關,無法證明連線對象值得信任。請關閉此選項,再依序檢查有效期限、名稱是否相符及憑證鏈。若訂閱來源反覆寫入錯誤設定,請聯絡提供者修正,不要一再略過驗證。

所有節點都握手逾時,是不是憑證同時出問題?

不要只憑逾時就下結論。先確認系統網路與時間,再檢查用戶端是否確實發出連線、目標連接埠是否可連線,以及日誌是否明確出現 x509 錯誤。可在獲准使用的其他網路中,以同一個節點再次測試,透過網路差異縮小問題範圍。

用戶端下載與安裝v2rayN · v2rayNG