証明書エラーの内容を記録し、アクセスを続行しない
ChromeやEdgeで「この接続ではプライバシーが保護されません」と表示されたら、まずページ下部にあるエラーコードをすべて記録してください。NET::ERR_CERT_DATE_INVALIDとNET::ERR_CERT_AUTHORITY_INVALIDでは確認すべき点が異なり、どちらも「ノードの不具合」と決めつけて対処することはできません。決済、メール、社内ログイン、管理画面などのページでは、直ちにパスワードの入力をやめてください。
通常のClashやClash Meta(mihomo)によるプロキシ転送では、接続先サイトの証明書が再発行されることはありません。ブラウザーがHTTPプロキシ経由でCONNECTトンネルを確立する場合も、TUNで通信を処理する場合も、通常HTTPS接続はブラウザーと接続先サイトの間で確立されます。プロキシを使うために、出所不明のルート証明書をあらかじめインストールする必要はありません。
次の4項目を記録する
- URLとエラーコード:記録するのはドメイン名と必要なパスだけにし、共有時にはログイントークン、クエリパラメーター、個人情報を削除してください。
- 影響範囲:特定の1サイトだけで起きるのか、互いに関係のない複数のHTTPSサイトで同時に起きるのかを確認します。
- 接続経路:システムプロキシやTUNの使用状況、選択中のプロキシグループと実際の接続ノードを記録します。
- 証明書情報:エラーページまたはブラウザーの証明書表示機能から、発行者、有効期間、サブジェクト代替名(SAN)を記録します。表示機能の場所や名称はブラウザーのバージョンによって異なります。
NET::ERR_CERTのエラーコードから原因を絞り込む
| エラーコード | 主な意味 | 優先して確認する項目 |
|---|---|---|
NET::ERR_CERT_DATE_INVALID | 証明書がまだ有効になっていない、または期限切れです。端末の時刻が誤っている可能性もあります。 | システムの日付と時刻、時刻同期、証明書の有効期間。 |
NET::ERR_CERT_AUTHORITY_INVALID | 信頼されたルート証明書までの検証チェーンをブラウザーが構築できません。 | 自己署名証明書、中間証明書の不足、HTTPS検査ソフト、ルート証明書の設定。 |
NET::ERR_CERT_COMMON_NAME_INVALID | アクセス先のホスト名と証明書に記載された名前が一致しません。 | SAN、名前解決の誤り、ポータルへのリダイレクト、Webサーバーの設定。 |
NET::ERR_CERT_REVOKED | 証明書が失効していると判定されました。 | サイトの証明書ステータスと端末のセキュリティソフトを確認してください。検証を緩めてアクセスを続けないでください。 |
エラー名にあるCOMMON_NAMEは、証明書のCNフィールドだけを検査するという意味ではありません。現在のブラウザーは主にSANに基づいてホスト名を検証します。たとえばwww.example.comにアクセスしたのに、portal.example.netのみを対象とする証明書が返された場合、ホスト名の検証に失敗します。
ERR_SSL_PROTOCOL_ERRORやERR_TUNNEL_CONNECTION_FAILEDは、上記の証明書エラーとは別の種類です。前者はTLSのネゴシエーション中に発生する場合があり、後者はプロキシトンネルが確立できていない可能性があります。この場合、接続先サイトの証明書をまだ取得できていないこともあるため、まずクライアントの接続記録とログを確認してください。
日付に関するエラー:システム時刻を合わせてからサイトの有効期間を確認
複数のサイトで同時にNET::ERR_CERT_DATE_INVALIDが表示される場合は、まずタスクバーの時刻を確認してください。端末を長期間シャットダウンしていた、バッテリーに異常がある、年を手動で変更したといった原因で、有効な証明書が期限切れまたは未有効に見えることがあります。タイムゾーンの表示が異なるだけで必ずエラーになるわけではありません。重要なのは、システム時刻が正確かどうかです。
- Windows 11:「設定」→「時刻と言語」→「日付と時刻」を開き、「時刻を自動的に設定する」をオンにします。タイムゾーンを確認したうえで、「その他の設定」の「今すぐ同期」をクリックしてください。
- macOS:「システム設定」→「一般」→「日付と時刻」を開き、「日時を自動的に設定」をオンにします。
- Android:システム設定で「日付と時刻」を検索し、自動設定をオンにします。メニューの場所はメーカーによって異なります。
- 時刻を合わせたら、ブラウザーを完全に終了してから再起動し、同じURLにアクセスします。端末の再起動後に時刻が再びずれる場合は、システムの時刻同期サービスやハードウェアクロックを確認してください。
システム時刻が正しく、特定のサイトだけでエラーが起きる場合は、そのサイトの証明書の有効期間を確認してください。証明書が実際に期限切れなら、サイト管理者による更新が必要です。ノードを変更すると別のサーバーに接続できることはありますが、サイトの証明書を修復することはできません。エラーが起きたドメイン、時刻、証明書の有効期間を記録し、サイト管理者に連絡しましょう。
発行者が不審な場合:MITM、パケットキャプチャツール、セキュリティソフトの残存設定を確認
複数の無関係なサイトで同じ不明な発行者の証明書が表示される場合は、ソフトウェアがHTTPS通信を復号していないか確認してください。MITMとは、中間者方式で通信を検査することです。デバッグ用プロキシ、企業ゲートウェイ、一部のセキュリティソフトは、端末で信頼されている証明書を使ってサイト証明書を再発行できます。これはClashによる通常の通信転送とは別の仕組みです。
まず再発行機能を停止し、証明書の出所を確認する
- Fiddler、Charles、mitmproxyなど、パケットキャプチャに使用したツールを終了し、ツールの設定でHTTPS復号またはSSL Proxyingを無効にしてください。ウィンドウを閉じただけでは、バックグラウンドプロセスが終了していない場合があります。
- セキュリティソフトのHTTPSスキャンや暗号化接続の検査機能を確認してください。個人用端末では、比較のため一時的に機能を無効にしてテストし、完了後は製品の説明に従って元に戻します。管理対象端末の場合は、先に管理者へ相談してください。
- Windowsでは
Win + Rを押してcertmgr.mscと入力し、現在のユーザーの「信頼されたルート証明機関」→「証明書」を確認します。コンピューター単位の証明書はcertlm.mscで確認できます。 - macOSでは「キーチェーンアクセス」を開き、「ログイン」と「システム」の各キーチェーンにある証明書と信頼設定を確認してください。
ルート証明書が残っているだけでは、証明書の再発行が現在行われているとは限りません。該当するプロキシや検査サービスが接続に関与している必要があります。一方、再発行サービスが動作していても信頼用証明書が削除済みなら、発行元が信頼されないというエラーが起きます。証明書マネージャーで追加と削除を繰り返すのではなく、プロキシの接続先、実行中のプロセス、証明書をまとめて確認してください。
名前が一致しない場合:DNSの異常、ネットワークポータル、サイト設定を切り分ける
NET::ERR_CERT_COMMON_NAME_INVALIDは、誤ったサーバーに接続した場合によく発生します。ただし、このエラーだけでDNS汚染やノードによるリダイレクトと断定することはできません。サイトのCDN設定ミス、公衆Wi-Fiのログインポータル、IPアドレスの直接入力でも同様のエラーが起きることがあります。
まず端末側の設定を確認し、次に実際の名前解決経路を調べる
- アドレスバーのドメイン名に誤りがないか、HTTPSのURLをIPアドレスに置き換えていないかを確認してください。証明書は通常ドメイン名を対象としており、サーバーのIPアドレスを対象としているとは限りません。
- hostsファイルにテスト用の設定が残っていないか確認してください。Windowsのパスは
C:\Windows\System32\drivers\etc\hosts、macOSとLinuxでは/etc/hostsです。編集する前にバックアップを作成してください。 - 空港やホテルなどのネットワークでは、まずシステムのネットワークログイン通知からポータル認証を完了してください。接続先のHTTPSサイトを装った証明書エラーページに、ポータルのパスワードを入力しないでください。
- ブラウザーでセキュアDNSが有効になっている場合、名前解決の経路がシステムと異なることがあります。Chromeの「設定」→「プライバシーとセキュリティ」→「セキュリティ」で「セキュアDNSを使用する」を確認し、元の設定を記録したうえで一時的に変更して比較してください。
Windowsでは次のコマンドを使って、システムの既定のDNSリゾルバーが返す結果を確認できます。hostsまたはシステムDNSを修正した後は、システムのキャッシュを消去してください。以下のドメインはコマンド例です。実際の調査では、エラーが起きたドメインに置き換えてください。
nslookup example.com
ipconfig /flushdns
nslookupだけでは、ブラウザーが実際にどのIPアドレスを使ったかは特定できません。mihomoのTUN、DNSリダイレクト、fake-ipを有効にしている場合、名前解決の経路が処理されることがあります。fake-ipモードで198.18.0.0/16の範囲にある合成アドレスが返されても、それだけで異常とは限りません。現在の設定にあるdns、enhanced-mode、fake-ip-rangeと、クライアントの接続記録を照らし合わせて判断してください。
DNSを変更しながらノードを切り替え、同時にキャッシュも消去するのは避けてください。一度に変更するのは1項目だけにし、既存の接続を閉じてから再試行します。CDNがネットワークごとに異なるIPアドレスを返すのはよくあることで、IPアドレスが異なるだけでは汚染の証拠になりません。確認すべきなのは、証明書がアクセス先のドメインを対象としているかどうかです。
直接接続とプロキシノードを比較して、接続経路の問題を特定する
プロキシを有効にしたときだけ問題が起きる場合は、条件をそろえて比較テストを行います。ログイン不要の公開ページを選び、同じドメインへの直接接続、ノードA、ノードBでの結果を記録してください。自動選択のプロキシグループでは実際のノードが切り替わることがあるため、グループ名だけでなく、接続記録で最終的な送信先を確認してください。
- 現在の状態を保存:現在の設定、ルールモード、システムプロキシとTUNの状態を記録します。接続経路が重複しないよう、他のVPNやパケットキャプチャ用プロキシは一時停止してください。
- 直接接続でテスト:ClashのシステムプロキシとTUNを無効にします。システムに手動プロキシや自動構成スクリプトが残っていないことを確認してから、クライアントを終了し、ブラウザーを再起動してください。クライアントを終了しても、すべてのプロキシ設定が自動的に解除されるとは限りません。
- プロキシ接続でテスト:元の設定に戻し、固定ノードで同じドメインにアクセスします。接続記録で適用されたルールと送信先を確認してください。
- 変更するのは1項目だけ:ルールとDNS設定は変えず、別の信頼できるノードに切り替えて、証明書の名前、発行者、エラーコードを比較します。
コマンドラインで比較する場合は、ローカルポートを明示する
以下は、クライアントにHTTPポートまたは混合ポートとして7897が表示されている場合のWindowsの例です。実際のポート番号はクライアントで確認してください。明示的なプロキシを使ってテストする場合は、いわゆる「直接接続」が透過的に処理されないよう、先にTUNを無効にします。macOSとLinuxでは、通常コマンド名をcurlに変えれば実行できます。
curl.exe -I -v --connect-timeout 10 --max-time 20 --noproxy "*" https://example.com/
curl.exe -I -v --connect-timeout 10 --max-time 20 --noproxy "" --proxy http://127.0.0.1:7897 https://example.com/
1つ目のコマンドは明示的なプロキシを経由せず、2つ目はローカルHTTPプロキシを指定します。今回確認する証明書検証を回避してしまうため、-kや--insecureは追加しないでください。-IはHEADリクエストを送信します。一部のサイトが405を返しても、証明書エラーとは限りません。HTTPレスポンスを受信できた場合、その接続では通常TLS検証が完了しています。
curlとブラウザーでは、信頼ストアやプロキシ経路が異なる場合があります。そのため、コマンドが成功してもブラウザーでのテストの代わりにはなりません。-vの出力を共有する前に、認証ヘッダー、Cookie、社内ネットワークのアドレスなどの機密情報を削除してください。テストのためにサブスクリプションURLをコマンドラインや公開検査サイトに貼り付けることも避けてください。
比較結果をもとに次の対処を決める
- 直接接続は正常で、特定のノードだけ失敗する:そのノードの使用を停止し、エラーが起きたドメイン、時刻、証明書の発行者、エラーコードを添えて報告してください。無関係なサイトで同じ不審な証明書が繰り返し返される場合は、接続経路のリダイレクトや乗っ取りに注意が必要です。ただし、証拠を確認して判断してください。
- すべてのノードと直接接続で失敗する:システム時刻、端末上のHTTPS検査、ルート証明書、現在のネットワークを優先して確認してください。サブスクリプションを何度も変更するのは避けましょう。
- 複数のネットワークで特定のサイトだけ失敗する:証明書チェーン、期限切れ証明書の更新、CDNへの証明書の割り当てなど、サイト側の対応が必要な可能性が高いです。
- ブラウザーでは失敗し、コマンドラインでは成功する:ブラウザー拡張機能、ポリシー、セキュアDNS、ブラウザー独自の証明書設定を確認してください。Firefoxの信頼設定はChromium系ブラウザーと異なる場合があります。
設定を元に戻して再テストする:検証スキップを設定に残さない
設定のskip-cert-verify: trueは、ブラウザーの証明書エラーを解決する汎用的な方法ではありません。TLSを使うプロキシプロトコルでは、通常この項目はカーネルがプロキシサーバーの証明書を検証するかどうかを制御します。ブラウザーに接続先サイトを信頼させる設定ではありません。変更するとノード接続の本人確認が弱くなる可能性がありますが、Webページの証明書に関するドメイン名、有効期間、信頼チェーンの問題は解決しません。
同様に、TUNが変えるのは主に通信を処理する経路であり、それ自体がサイトの証明書を発行することはありません。TUNを有効にしたときだけエラーが起きる場合は、通信が別のノードに向かっていないか、DNSが処理されていないか、別のVPNと競合していないかを確認してください。すぐにシステムへ証明書をインストールする必要はありません。
- 一時的に変更したセキュアDNS、セキュリティソフトの検査機能、プロキシグループの設定を、確認済みの元の設定に戻してください。
- ブラウザーを完全に再起動し、最初にエラーが起きたドメインと、正常に表示される別のドメインをそれぞれテストしてください。
- システム時刻が正常に同期していること、エラーページが再表示されないこと、接続記録のルールとノードが想定どおりであることを確認してください。
- 不審な証明書が表示されたページでアクセスを続け、パスワードを入力してしまった場合は、信頼できる端末とネットワークからパスワードを変更し、ログイン中のセッションを確認してください。アカウントサービスのセキュリティ手順にも従ってください。
証明書エラーは「エラーコード全体を確認する→システム時刻を調べる→証明書の発行者と名前を確認する→直接接続とノード接続を比較する」の順に対処できます。この手順なら、端末の信頼設定、サイトの設定、プロキシ経路の問題を切り分けられ、設定変更や検証の無効化を繰り返して運任せにすることを避けられます。