TLS 交握失敗與憑證錯誤排查:系統時間、SNI 與 allowInsecure 三大關鍵

憑證錯誤不能只靠反覆切換節點判斷。先核對系統時間,再檢查 SNI 與節點位址的關係,最後確認伺服器端憑證鏈,通常能迅速判定問題出在用戶端設定還是伺服器端。

本文速覽

本文適合遇到 certificate、x509、handshake、unknown authority 等記錄的 v2rayN、v2rayNG 與 v2flyNG 使用者。排查順序是先保留原始記錄,接著檢查系統時間與時區,再核對 SNI,最後驗證憑證有效期與憑證鏈;allowInsecure 僅用於短時間定位問題,不應作為長期修復方案。

TLS 錯誤發生在哪個步驟

VMess 或 VLESS 節點啟用 TLS 後,用戶端並不是一連上伺服器就開始傳輸代理資料。它必須先建立 TCP 連線,再傳送 TLS ClientHello,其中可能包含 SNI、支援的 TLS 版本與 ALPN;伺服器隨後回傳憑證鏈並協商工作階段金鑰。只有交握成功後,後續的協定驗證與資料傳輸才會進入加密通道。

解析節點位址建立 TCP傳送 SNI驗證憑證進入代理協定

因此,「節點無法連線」不等於節點帳號失效。如果記錄已出現憑證過期、主機名稱不相符或未知簽發者,問題通常早於 VMess 使用者 ID、VLESS UUID、傳輸路徑與路由規則。此時修改訂閱群組、系統代理連接埠或分流規則,通常無法消除憑證錯誤。

排查時應先開啟用戶端核心記錄,而不是只觀察瀏覽器頁面。v2rayN 可在主視窗底部的記錄區查看最近連線,也可透過「設定」→「參數設定」確認記錄層級沒有設定得過低。v2rayNG 與 v2flyNG 可進入對應設定的執行記錄頁面,保存首次出現的 TLS 或 x509 原文。

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

原因與解法:本機時間超出憑證有效期,或伺服器端憑證確實已過期——先同步系統時間,再查看記錄中的目前時間與憑證起訖日期。

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

原因與解法:伺服器回傳的憑證名稱與用戶端驗證名稱不一致——核對節點的 SNI,不要將訂閱備註、WebSocket 路徑或 IP 位址填入此欄位。

錯誤:x509: certificate signed by unknown authority

原因與解法:憑證鏈缺少中繼憑證,或憑證不受系統信任——更新系統憑證環境;若多台裝置同時出現問題,應由伺服器端補齊憑證鏈。

錯誤:remote error: tls: handshake failure

原因與解法:伺服器端主動拒絕交握,常見原因是 SNI、TLS 版本或 ALPN 不相符——先核對訂閱的原始參數,再檢查伺服器端的監聽設定。

第一步:檢查系統時間與時區

TLS 憑證包含 Not Before 與 Not After 兩個時間界線。用戶端會使用裝置目前時間判斷憑證是否已生效、是否已過期。系統時間快了幾個月,會將正常憑證判定為過期;慢了幾個月,則可能顯示憑證尚未生效。時區本身不會改變標準時間,但錯誤時區搭配手動校時,經常會造成實際時間偏差。

±60 秒
建議時鐘誤差範圍
443
TLS 常見伺服器連接埠
TLS 1.2+
常見相容範圍
10808
v2rayN 常見本機 SOCKS 連接埠

Windows 應在日期與時間設定中開啟自動設定時間與自動設定時區,然後執行一次立即同步。Linux 桌面環境可先查看系統時間狀態,確認 NTP 服務處於同步狀態。Android 裝置應啟用由網路提供的日期、時間與時區。修正後必須完全停止用戶端核心並重新啟動,避免舊連線繼續沿用失敗狀態。

  1. 保留原始記錄

    中斷目前節點連線,清除記錄後重新連線一次,保存第一筆 x509 或 TLS 錯誤及其時間戳記,不要只保留後續的逾時資訊。

  2. 核對目前時間

    將裝置日期、分鐘與時區和可信任的系統時間來源比對,誤差盡量控制在 60 秒內,並檢查是否誤設為手動時間。

  3. 執行時間同步

    開啟系統自動同步;Linux 可執行 timedatectl status,確認輸出中的系統時鐘已同步,且時區設定正確。

  4. 重新啟動用戶端核心

    在 v2rayN 中先停止服務再重新啟動;Android 用戶端則中斷目前設定,結束連線後重新連線,避免沿用舊工作階段。

  5. 比較複測結果

    如果錯誤中的 not yet valid 消失,表示根因是本機時間;若仍顯示相同的憑證截止日期,請繼續檢查憑證是否真的已過期。

第二步:核對 SNI 與節點位址

SNI 是 TLS ClientHello 中傳送的伺服器名稱。一個 IP 位址可能承載多個網站,伺服器會依據 SNI 選擇憑證與對應的虛擬主機。節點的連線位址可以是網域名稱,也可以是 IP;但憑證驗證名稱通常必須是憑證中列出的網域,不能自行根據備註猜測。

例如,用戶端連線位址是某個入口 IP,而憑證簽發給某個網域,此時節點設定需要在 serverName 或 SNI 欄位填入該網域。反過來,如果節點位址本身已是正確網域,且訂閱明確提供 SNI,就應保留訂閱值。將 WebSocket 的 Host、HTTP 路徑、訂閱名稱或節點備註複製到 SNI,都會造成名稱不相符。

設定項目 實際作用 常見錯誤
位址 用於 DNS 解析並建立 TCP 連線 誤填含有協定前綴或路徑的完整網址
連接埠 指定伺服器端 TLS 監聽連接埠 將本機 10808 誤填為遠端連接埠
SNI / serverName 選擇伺服器端憑證並決定驗證名稱 填成 IP、節點備註或傳輸路徑
Host 用於 HTTP 或 WebSocket 請求標頭 認為 Host 必然與 SNI 相同
Path 指定 WebSocket 或 HTTP 傳輸路徑 用錯誤路徑解釋憑證名稱不相符

在 v2rayN 中,可雙擊目標節點或按右鍵選擇編輯伺服器,在 TLS 相關區域核對 serverName、SNI 或「偽裝網域」欄位;實際顯示名稱會隨核心與設定類型而變。修改前先保存訂閱原值,修改後只測試這一項,不要同時更換連接埠、傳輸方式與 UUID。

在 v2rayNG 或 v2flyNG 中,先中斷連線,再點選設定右側的編輯入口,找到 TLS 安全設定下的伺服器名稱或偽裝網域。若設定由訂閱產生,手動修改可能在下次更新訂閱時被覆蓋;確認正確值後,應請訂閱提供方修正來源設定。

錯誤:certificate is valid for example.net, not 203.0.113.10

原因與解法:用戶端正在依 IP 驗證憑證——將訂閱明確提供的憑證網域填入 SNI,同時保留原連線位址,不要關閉驗證來掩蓋問題。

錯誤:tls: unrecognized name

原因與解法:伺服器端不接受目前的 SNI——還原訂閱原始的 serverName;若多個用戶端都失敗,需檢查伺服器端虛擬主機與 TLS 監聽設定。

第三步:判斷憑證過期與憑證鏈不完整

系統時間與 SNI 都正確後,應檢查伺服器端實際回傳了哪張憑證。憑證過期表示 Not After 早於目前時間;憑證鏈不完整則常見於伺服器只傳送網站憑證,沒有傳送必要的中繼憑證。兩者都屬於伺服器端設定問題,重新匯入訂閱通常無法修復。

在安裝 OpenSSL 的 Linux 環境中,可以使用以下指令查看 443 連接埠回傳的憑證鏈。-connect 後填寫實際連線網域與連接埠,-servername 後填寫節點要求的 SNI。測試時必須同時保留這兩個參數,否則結果可能來自另一組預設憑證。

openssl s_client -connect server.example:443 \
  -servername node.example \
  -showcerts

openssl s_client -connect server.example:443 \
  -servername node.example \
  -verify_return_error < /dev/null

輸出中的 subject 是目前憑證主體,issuer 是簽發者,notBefore 與 notAfter 是有效期。最後一行若顯示 Verify return code: 0 (ok),表示目前系統信任環境能建立完整的驗證路徑。代碼 10 通常表示憑證過期,代碼 20 或 21 常見於無法取得本機簽發者,或無法驗證第一張憑證。

allowInsecure 能解決什麼,風險在哪裡

allowInsecure 的作用是允許用戶端接受無法通過正常驗證的伺服器憑證。它可能讓過期、自簽、名稱不相符或不受信任的憑證暫時通過,但不會修復伺服器憑證,也不會自動修正 SNI、位址、連接埠或傳輸設定。

啟用後,TLS 資料仍會加密,但用戶端失去了可靠確認伺服器身分的關鍵步驟。若攻擊者能介入網路連線,就可能使用另一張憑證冒充目標伺服器。因此,此選項適合短時間診斷:啟用後若連線立即恢復,可以確認問題集中在憑證驗證階段;得出結論後應關閉,並修正時間、SNI 或伺服器端憑證鏈。

保留失敗記錄暫時啟用只測試一次確認驗證問題關閉並修復

在 v2rayN 中可編輯對應伺服器,在 TLS 區域尋找 allowInsecure 或「略過憑證驗證」。v2rayNG 與 v2flyNG 通常會在設定編輯頁的 TLS 設定中顯示「允許不安全連線」或類似名稱。只調整目前測試節點,不應批次修改所有訂閱設定。

根據記錄結果判定問題所在

一次有效的排查應只變更一個變數,並記錄修改前後的第一筆錯誤。若同時重新匯入訂閱、切換核心、修改 SNI、啟用 allowInsecure 並更換網路,即使連線恢復,也無法判斷真正原因。後續更新訂閱還可能讓問題再次出現。

建議建立最小測試集合:固定同一個節點、同一個網路與同一個用戶端核心,先同步時間,再核對 SNI,接著驗證憑證鏈,最後才暫時測試 allowInsecure。測試期間暫時關閉頻繁自動切換節點的功能,避免記錄混入其他伺服器的錯誤。

同步時間後仍提示憑證過期?

查看記錄或 OpenSSL 輸出中的 notAfter。如果截止日期確實早於目前時間,問題在伺服器端憑證;若用戶端看到的日期與伺服器端公布結果不同,請繼續檢查是否連線到舊的入口 IP。

SNI 應該填節點位址還是 Host?

填寫訂閱明確提供的伺服器名稱。若未單獨提供,通常使用憑證涵蓋的網域,不能只憑節點備註判斷;Host 與 SNI 的用途不同,不應強行設為相同。

啟用 allowInsecure 後可以連線,接下來該怎麼做?

立即保存啟用前後的記錄,然後關閉此選項。根據具體錯誤檢查憑證有效期、名稱是否相符與憑證鏈,不要讓臨時診斷設定長期留在訂閱中。

更新訂閱為什麼沒有修復憑證錯誤?

訂閱只會更新用戶端收到的節點參數。若伺服器端仍傳送過期憑證或缺少中繼憑證,重複更新也不會改變交握結果,應由伺服器端更新並重新載入憑證。

只有行動網路顯示交握失敗,該怎麼辦?

先比較行動網路與其他網路的 DNS 解析結果,再檢查系統時間是否由網路自動校準。若憑證名稱發生變化或回傳不同入口,應保存兩組記錄交叉比較。

最終判斷可濃縮為三點:時間錯誤由本機修正;SNI 錯誤依訂閱與憑證網域修正;多台裝置都收到過期憑證或不完整憑證鏈,則由伺服器端處理。只有先分開這三類問題,TLS 交握失敗才不會被誤判為連接埠、UUID、訂閱或路由分流故障。

下載 v2rayN 查看 Windows、macOS、Android、Linux 用戶端