ノードへの接続は開始できるものの、TLSハンドシェイクや証明書の検証で失敗する場合に役立つ内容です。「エラー全文を確認 → システム時刻を同期 → SNIと証明書名を確認 → 証明書チェーンを確認 → 再テスト」の順に進めましょう。接続先アドレス、TLS名、HTTP Hostを区別し、証明書検証は有効のままにしてください。検証を無効にする方法を恒久対策にしないことが重要です。
まずエラー全文を確認:証明書エラーと接続タイムアウトは別の問題
TLSハンドシェイクは、プロキシプロトコルの認証より前に行われます。通常、クライアントはまずサーバーに接続し、暗号化パラメーターをネゴシエートして証明書を受け取り、サーバーの正当性を検証してから上位層の通信に進みます。そのため、明確なx509証明書エラーが出ている場合は、VMessやVLESSのユーザー識別子を変更する前に、時刻・名前・信頼チェーンを確認してください。ログにhandshake failedとだけ表示される場合は、原因を断定せず、詳細なエラーを確認する必要があります。
v2rayNのメイン画面にあるログ欄を確認します。画面によっては「情報」と表示されます。テストするノードを選び、古いログを消してから実際にWebページへアクセスし、同じ時刻付近に記録されたエラー全体を確認してください。メニュー名はバージョンや画面によって異なります。ログに接続失敗としか表示されない場合は、「設定」→「パラメーター設定」からログレベルを探し、一時的にinfoへ引き上げて再試行します。調査後は元のレベルに戻してください。ログを共有する前に、サブスクリプションURL、ユーザー識別子、アクセス先を削除しましょう。
エラー:x509: certificate has expired or is not yet valid
原因と対処:端末の時刻が証明書の有効期間外になっているか、サーバーで実際に期限切れの証明書が使われています。まず端末の時刻を同期し、証明書の有効期間を確認してください。時刻が正しいのに失敗する場合は、サーバー管理者に証明書の更新と再読み込みを依頼します。
エラー:x509: certificate is valid for example.com, not www.example.com
原因と対処:クライアントが検証する名前が証明書の対象範囲に含まれていません。ノードで指定されたSNIと証明書のSANを確認してください。ドメインの接頭辞を付けたり外したりして試すのは避けましょう。ここにあるドメイン名はエラーの形式を示す例です。
エラー:x509: certificate signed by unknown authority
原因と対処:現在の信頼ストアで証明書チェーンを検証できません。サーバーから中間証明書が漏れなく送信されているか、端末のルート証明書ストアが古くないかを確認してください。組織管理のプライベート証明書の場合は、管理者が認めた方法で信頼設定を行います。
エラー:remote error: tls: handshake failure
原因と対処:接続先がハンドシェイクを拒否しています。この行だけでは原因を特定できません。TLSの有効化、SNI、ALPN、接続先ポートを確認し、サーバー管理者に仮想ホストとハンドシェイク設定をサーバーログと照合してもらいましょう。
システム時刻を同期する:日付を修正して同じノードを再テスト
証明書には「有効期間の開始」と「有効期間の終了」があります。クライアントは端末の現在時刻を使って、証明書が有効かどうかを判定します。日付が数か月遅れていると、証明書がまだ有効でないと判断されることがあります。逆に日付が未来になっていると、有効な証明書が期限切れと判定される場合があります。タイムゾーンの表示が正しくなくても、実際の時刻まで間違っているとは限りません。タスクバーの時刻だけで判断せず、日付・時刻・タイムゾーンを確認してください。
-
時刻の設定を開く
Windows 11では「設定」→「時刻と言語」→「日付と時刻」を開きます。Windows 10も「設定」→「時刻と言語」→「日付と時刻」から確認できます。まず年・月・日が正しいか確認してください。
-
今すぐ同期する
「時刻を自動的に設定する」を有効にし、タイムゾーンが現在地に合っていることを確認します。「時計を同期する」の項目にある「今すぐ同期」をクリックしてください。同期できない場合は、まずインターネットに接続できるか確認します。組織管理の端末では、管理者が指定した時刻ソースを使用してください。
-
同期結果を確認する
最後に同期が成功した時刻が更新されているか確認します。コマンドプロンプトで
w32tm /query /statusを実行すると、時刻ソースと最後に同期が成功した時刻を確認できます。コマンドが失敗する場合は、Windows Timeサービスの状態と組織のポリシーを確認してください。 -
元のノードで再テスト
サーバーアドレス、ポート、SNIは変更せず、同じノードに再接続してWebページにアクセスします。有効期間に関するエラーが続く場合は、ログに表示された現在時刻と証明書の有効期間をあわせて管理者に確認してもらいましょう。
Android端末では、システム設定で「日付と時刻」を検索し、自動設定時刻と自動設定タイムゾーンを有効にしてから接続を再試行してください。設定項目の場所はメーカーによって異なります。システム時刻を直すためにプロキシアプリの設定を変更する必要はありません。PCの電源を切るたびに日付が戻る場合は、ファームウェアの時刻とマザーボードの電池も確認してください。クライアントでノードを切り替え続けるだけでは、根本原因を見逃すことがあります。
w32tm /query /status
w32tm /query /source
上記のコマンドは状態を確認するもので、ノード設定は変更しません。ローカル時計が時刻ソースになっていたり、同期失敗の記録があったりする場合は、証明書検証を無効にせず、時刻サービスを引き続き調査してください。また、古い証明書が有効だった日付までシステム時刻を手動で戻さないでください。他の安全な通信にも影響します。
SNIの設定方法:サーバーアドレス・証明書名・Hostを区別する
SNIはTLSハンドシェイクでサーバーに送信される名前で、同じ接続先で適切なサイトや証明書を選ぶために使われます。クライアントは通常、設定されたサーバー名を使って証明書も検証しますが、空欄時の動作はコアやクライアントによって異なります。空欄なら必ず正しい名前が使われると考えないでください。ノード提供元が明示したTLS設定に従い、https://、パス、ポートを付けずにドメイン名だけを入力します。
| 設定項目 | 役割 | 確認方法 |
|---|---|---|
| サーバーアドレス | 接続先のドメイン名またはIPアドレスを指定 | 現在のサブスクリプションと照合し、古いアドレスや入力ミスがないか確認 |
| サーバーポート | 接続する待ち受けポートを指定 | TLSの一般的なポートは443ですが、実際の設定に従ってください |
| SNI / serverName | TLS接続先の選択に使われ、通常は証明書の検証名にもなる | 管理者から指定された名前と証明書のSANを照合 |
| Host | WebSocketなどのトランスポートでHTTPリクエストのルーティングに使用 | トランスポート設定に従って入力。TLS層のSNIの代わりにはなりません |
| パス / Path | トランスポートの接続先を特定するために使用 | 大文字・小文字と先頭のスラッシュを確認し、SNI欄には入力しない |
v2rayNのメイン一覧でテストするノードをダブルクリックし、編集画面で「トランスポート層のセキュリティ」がノードの要件どおりTLSになっているか確認します。次に「サーバー名」またはSNI欄を確認してください。プロトコルによって編集画面は多少異なります。項目が見当たらない場合は、正しいプロトコルとトランスポートセキュリティを編集しているか確認しましょう。サブスクリプションのノードをテストする場合は、複製してから編集すると、次回の更新で手動変更が上書きされるのを避けられます。
証明書名はSAN(Subject Alternative Name/サブジェクト代替名)で確認します。たとえば証明書の対象がexample.comだけなら、www.example.comは自動的には含まれません。*.example.comは通常a.example.comには一致しますが、ルートドメインのexample.comや、階層が一つ多いa.b.example.comには一致しません。接続先がIPアドレスでもドメイン名の証明書を使う場合は、ノードの指示に従って名前を明示的に指定してください。IPアドレスをドメイン証明書の検証対象として扱わせないようにしましょう。
- 適当なWebサイトのドメインをSNIに設定しないでください。接続先で、その名前に対応する設定が必要です。
- 証明書名の不一致を解消するためにHostだけを変更しないでください。通常、HTTPリクエストはTLSの検証が成功した後に送信されます。
- 「偽装ドメイン」は共通のプロトコル項目ではなく、Hostを指す場合もSNIを指す場合もあります。提供元にどちらを意味するのか確認してください。
- REALITYを使うノードでは、serverNameや公開鍵など専用のパラメーターを確認してください。通常のTLSと同じ証明書差し替えの方法は使えません。
証明書チェーンとTLSバージョン:サーバーが正しい証明書を返すようにする
端末の時刻とSNIが正しい場合は、次にサーバー証明書を確認します。よくあるのは、証明書を更新したもののリバースプロキシを再読み込みしていないケースや、サーバーがサイト証明書だけを送信し、中間証明書を送っていないケースです。ブラウザーが証明書チェーンを補完できる場合でも、すべてのクライアントやコアで検証できるとは限りません。サーバーから完全な証明書チェーンを正しく送信する必要があります。
コマンドラインを使える場合は、OpenSSLでTLS接続先を個別に確認できます。以下はコマンドの書き方の例で、example.comはドキュメント用のドメインです。実際のノードではありません。診断には実際の接続先、ポート、SNIを指定してください。このコマンドは接続先へ直接接続するため、v2rayNのシステムプロキシ設定は自動的には使われません。接続先アドレスとSNIが異なる場合は、-connectと-servernameにそれぞれ入力し、同じ名前に無理にそろえないでください。
openssl s_client -connect example.com:443 -servername example.com -showcerts -verify_hostname example.com -verify_return_error
返された証明書の名前、有効期間、証明書チェーン、検証結果を確認してください。コマンドの-servernameはSNIを送信し、-verify_hostnameは名前を明示的に検証します。両者は別の処理です。使用中のツールがこれらの引数に対応していない場合は、まずOpenSSLのバージョン情報を確認してください。ハンドシェイクが完了したらCtrl+Cで終了できます。このテストで確認できるのはTLSだけです。WebSocketのパス、プロキシプロトコルの認証、通信の転送が正常かどうかは確認できません。
結論:同じ接続先から誤った証明書が返る場合は、まずサーバー側の割り当てを修正
接続先とSNIが設定どおりなのに別サイトの証明書が返る場合は、管理者に接続先の仮想ホストと証明書の関連付けを確認してもらいましょう。クライアントのHostやローカル待ち受けポートを変更しても、この問題は解決しません。
- 「不明な認証局」と表示される場合:証明書チェーン全体、端末のルート証明書の更新状況、管理ネットワークでTLS検査が行われていないかを確認します。
- 特定のネットワークだけで失敗する場合:スマートフォンのテザリングと元のネットワークで比較し、証明書の発行者が異なるか記録します。
- プロトコルバージョンや暗号スイートの不一致が表示される場合:双方の設定を照合し、バージョンをむやみに固定せず、まずノード推奨の標準ネゴシエーションに戻します。
- 通常のTLSポートで別のサービスが動いている場合:接続先で平文HTTPや別プロトコルが動いていないか、転送先が正しいか確認します。
allowInsecureの設定方法:証明書を正しく修復し、検証は有効のままにする
一般的なTLS設定でallowInsecureは、サーバー証明書の検証を省略するかどうかを表します。有効にすると、名前や信頼チェーンのエラーが出なくなることがありますが、証明書が修復されたことや、想定したサーバーに接続できたことを意味しません。ポートに接続できない、プロトコルの選択が誤っている、サーバーがハンドシェイクを拒否するなどの問題は解決できず、正しいSNIの代わりにもなりません。
v2rayNのノード編集画面で「安全でない接続を許可」を探してください。画面によってはallowInsecureと表示されます。クライアントに全体の既定値がある場合は、新しく追加するノードに影響するかも確認しましょう。v2rayNGはXrayコア、v2flyNGはv2flyコアを使用しており、設定画面や対応する項目が異なる場合があります。それぞれの実際の画面に従い、一方のクライアントから出力した設定を別のクライアントにそのまま適用しないでください。
- 現在のノードのサーバーアドレス、ポート、SNI、検証設定を記録し、元の設定に戻せるようにしておきます。
- 証明書検証を再び有効にして接続し、名前・有効期間・信頼チェーンのどの問題が残っているか確認します。
- 該当する問題に応じて修正します。プライベート証明書は管理者から信頼できる資料を入手してください。チャットのスクリーンショットや見知らぬ添付ファイルからルート証明書をインストールしないでください。
- 作業後、設定がオフのまま残っていないか再確認します。テスト用の設定をサブスクリプションの複製や他の端末に残さないようにしてください。
再テストとよくある質問:1回の確認で変更するのは1項目だけ
修正後は同じノード、同じWebページ、同じプロキシモードで再テストします。まずログに証明書エラーが出なくなったことを確認し、その後ページが表示されるか確認してください。TLSを通過してもアクセスできない場合は、トランスポート経路、プロキシプロトコルの認証、DNS、ルーティングの振り分けを調査します。ノードの遅延値は測定方法に応じた結果にすぎず、実際のリクエストを検証する代わりにはなりません。
時刻の同期に成功したのに、証明書が期限切れと表示されるのはなぜですか?
ログにある証明書の有効期限と照らし合わせてください。端末の日付が正しい場合、サーバーで古い証明書が使われている可能性があります。管理者に更新結果、証明書ファイルのパス、サービスの再読み込み状態を確認してもらいましょう。クライアントの再インストールでは通常解決しません。
ブラウザーではドメインを開けるのに、ノードのハンドシェイクに失敗するのはなぜですか?
ブラウザーが同じポート、同じIPアドレス、同じSNIに接続しているか確認してください。トップページが開けても、ノードの接続先設定が正しいとは限りません。クライアントの信頼ストアとサーバーの中間証明書チェーンも確認しましょう。
サブスクリプションの更新後にSNIが元に戻る場合はどうすればよいですか?
サブスクリプションを更新すると、ノードの設定が再生成されます。ノードを複製して比較テストを行い、修正前後の違いを記録して、提供元にサブスクリプションの内容を修正してもらいましょう。毎回手動で修正する方法を定常運用にしないでください。
職場のネットワークだけで「不明な認証局」と表示される場合、どう調べればよいですか?
同じ端末を信頼できる別のネットワークに接続し、証明書の発行者が変わるか記録してください。管理対象ネットワークでは検査ポリシーが適用されている可能性があります。管理者に確認し、検証を無効にしたり、出所不明のルート証明書をインストールしたりしないでください。
ローカルポートを10808に変更するとTLSエラーは直りますか?
いいえ。10808は一般的なローカルプロキシの待ち受けポートで、リモート証明書の検証とは別の処理です。ログにローカルポートの使用中と明記されている場合に限り、待ち受けポートを変更し、利用側の設定も合わせてください。
- 時刻:システムの同期が成功し、再起動後も日付が戻らないことを確認します。
- 名前:SNIにプロトコルやパスを含めず、サーバー証明書のSANと一致させます。
- 信頼:証明書検証を有効にし、サーバーから完全な証明書チェーンが返ることを確認します。
- 結果:リクエストが成功した時刻を記録します。障害報告には関連するエラーだけを機密情報を伏せて添付し、サブスクリプション全体は送信しないでください。