「証明書の有効期限切れ」「証明書名の不一致」「unknown authority」の 3 種類の TLS エラーに遭遇したユーザー向けに、システム時刻、SNI とドメインの一致、証明書チェーンの完全性、allowInsecure の順で確認し、各項目で v2rayN と v2rayNG の具体的な操作箇所を説明します。
TLS ハンドシェイク失敗のよくあるエラーと確認手順
TLS ハンドシェイクは、V2Ray が接続を確立する際の最初のステップです。クライアントがサーバーに ClientHello を送信し、サーバーは証明書チェーンを返します。ローカルカーネルは証明書の有効期限、ドメインの一致、発行チェーンを順に検証します。いずれかが失敗すると、接続はハンドシェイク段階で終了し、「接続済みだがすぐに切断される」またはコアログの証明書エラーとして現れます。v2rayN と v2rayNG は同じ Xray カーネルを使用しているため、エラー形式は同じです。
確認手順は、まずエラー本文を読み、次にシステム時刻、次にドメインと SNI、最後に証明書チェーンを確認する順序に固定することをお勧めします。順番を守らないと、ノードを切り替え続けるだけで、本当の問題が解決されないことがよくあります。
エラー:tls: failed to verify certificate: x509: certificate has expired or is not yet valid
原因と解決策:端末のシステム時刻と実際の時刻のずれが大きく、証明書の有効期間外になっています。システムの自動時刻同期を有効にし、カーネルを再起動して再試行してください。
エラー:tls: failed to verify certificate: x509: certificate is valid for v2.example.com, not 203.0.113.10
原因と解決策:サーバーアドレスに IP を入力しており、証明書はドメインに対してのみ発行されています。アドレス欄をドメインに戻すか、SNI フィールドに証明書のドメインを入力してください。
エラー:tls: failed to verify certificate: x509: certificate signed by unknown authority
原因と解決策:サーバーが中間証明書を送信しておらず、ローカルで信頼チェーンを構築できません。サーバー側で完全な証明書チェーンファイルに変更し、クライアント側では一時的に allowInsecure にチェックを入れて切り分けを確認できます。
3 つのエラーはそれぞれ独立した確認ポイントに対応します。以降の章ではこの順序で説明し、各節の最後に v2rayN と v2rayNG の具体的な操作手順を示します。
システム時刻のずれ:expired と not yet valid の第一の原因
証明書の検証は端末のローカル時刻を基準に行われます。証明書には NotBefore と NotAfter の 2 つの時間境界が含まれており、ローカル時刻がこの範囲外にあると「有効期限切れ」または「まだ有効ではない」エラーが発生します。v2rayN のコアログパネルには毎回のハンドシェイクのローカルタイムスタンプが出力されるので、まずログの時刻と実際の時刻を比較し、数分以上のずれがあれば時刻の問題と判断できます。
時刻同期は 2 つのステップだけです。自動時刻を有効にし、すぐに同期をクリックします。仮想マシンやデュアルブートのユーザーは、ゲスト OS の時刻が再開後に更新されているか追加で確認してください。サスペンド中は時刻が停止します。
Windows と Android の時刻同期手順
- Windows 11 / 10:設定 → 時刻と言語 → 日付と時刻 で「時刻を自動設定する」を有効にし、「今すぐ同期」をクリックします。
- Android:設定 → システム → 日付と時刻 で「自動的に時刻を設定」を有効にします。機種によっては「その他の設定」配下にあります。
- 仮想マシンとデュアルブート:再開後、まず手動で時刻を同期してください。サスペンドや休止状態による時刻の停止を防ぎます。
同期が完了したらカーネルを再起動して再試行します。v2rayN では「コア」→「コアを再起動」で実行し、v2rayNG では接続スイッチをオフにして再度オンにします。エラーが消えれば、原因は時刻のずれです。
SNI とドメインの一致:証明書名の不一致エラーの特定
ドメインの一致は証明書検証の 2 番目のステップです。クライアントは「サーバーアドレス」または独立した SNI フィールドを使って、証明書の CN と SAN リストを照合します。アドレスに IP を入力し、証明書がドメインに対してのみ発行されている場合、ログに valid for xxx, not yyy エラーが表示されます。Xray カーネルではこのフィールド名は serverName で、GUI では SNI と表示されます。
{
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"allowInsecure": false,
"serverName": "v2.example.com"
}
}
}
| サーバーアドレス | SNI フィールド | ハンドシェイク結果 |
|---|---|---|
| v2.example.com | 空欄 | 正常。SNI はアドレスのドメインが自動的に使われます。 |
| 203.0.113.10 | v2.example.com | 正常。接続は IP で行われ、証明書は SNI で検証されます。 |
| 203.0.113.10 | 空欄 | 証明書名が一致せず、ハンドシェイクが終了します。 |
修正方法は 2 つだけです。アドレスをドメインに戻すか、IP アドレスのまま SNI フィールドに証明書のドメインを入力します。前者はドメインが解決できる場合に、後者はドメインが汚染され IP 直結が必要な場合に適しています。v2rayN では SNI はサーバー編集ウィンドウの TLS グループにあり、v2rayNG ではサーバー編集ページの TLS 関連設定で入力します。
証明書チェーン欠落と allowInsecure の正しい使い方
証明書チェーンはリーフ証明書、中間証明書、ルート証明書で構成されます。サーバーはリーフ証明書と中間証明書を送信する必要があり、ルート証明書はクライアントのシステム信頼ストアから提供されます。中間証明書が欠落していると、クライアントは信頼チェーンを構築できず、unknown authority エラーが発生します。これはサーバー側の設定問題で、リーフ証明書だけをデプロイファイルに記述している場合によく見られます。
allowInsecure は、有効期限、ドメイン、発行元を含む証明書検証チェーン全体をスキップする機能です。証明書自体の問題を修正するわけではなく、ハンドシェイクを通すだけです。一時的にチェックを入れて接続に成功した場合、問題が確かに証明書側にあることを示します。その後はサーバー側で証明書を修正し、このオプションを長期間有効にしたままにしないでください。
v2rayN では allowInsecure はサーバー編集ウィンドウの TLS グループにあり、チェック後にカーネルを再起動すると有効になります。v2rayNG ではサーバー編集ページの allowInsecure スイッチで、切り替え後に切断して再接続する必要があります。データは TLS で暗号化されたままですが、証明書の身元が検証されなくなるため、中間者攻撃者が証明書を差し替える可能性があります。
v2rayN と v2rayNG の TLS 設定比較
以下の表は 4 つの確認ポイントについて 2 つのクライアントでの入口をまとめたものです。この順序で操作すれば、ほとんどの証明書エラーをカバーできます。
| 確認項目 | v2rayN | v2rayNG |
|---|---|---|
| コアログ | メイン画面下部のログパネル | メイン画面のログ入口 |
| サーバーアドレス | サーバー編集 → アドレス | サーバー編集 → アドレス |
| SNI | サーバー編集 → TLS → SNI | サーバー編集 → TLS グループ → SNI |
| allowInsecure | サーバー編集 → TLS → allowInsecure | サーバー編集 → allowInsecure スイッチ |
| 接続の再起動 | コア → コアを再起動 | 接続スイッチをオフにして再度オン |
certificate has expired エラーが出るが、スマホでは時刻が正しく表示される
まず v2rayN のログパネルに出力されたハンドシェイクのタイムスタンプを確認し、カーネルが読み取ったローカル時刻を確認します。次に Windows Time サービスが実行中かどうかを確認し、管理者コマンドラインで w32tm /resync を実行して強制同期します。
ドメインを入力したのに not valid for エラーが出る
ドメインが証明書の SAN と完全に一致しているか確認してください。www プレフィックスの有無も不一致になります。ブラウザで https://そのドメイン に直接アクセスし、証明書の詳細にある「サブジェクト代替名」リストを 1 つずつ照合します。
allowInsecure にチェックを入れたら接続できたが、そのまま使い続けてもよいか
お勧めしません。検証をスキップするだけで証明書は修正されません。長期間使用する場合は、サーバー側の証明書チェーンを完全なものにしてから、allowInsecure をオフに戻してください。
証明書エラーが特定のノードでのみ発生する
そのノードの証明書設定に問題があります。別のノードに切り替えると一時的に復旧します。同時に、そのノードのアドレスに IP を誤って入力し、証明書がドメインに対してのみ発行されていないか確認してください。
カーネルを再起動しても同じエラーが出る
サーバーリストで変更後のノードが選択されているか確認し、v2rayNG ではサブスクリプションを再取得してから再試行してください。一部の機種では、システム時刻を同期してから切断・再接続する必要があります。