すべてのプロダクト
Search
ドキュメントセンター

HTTPDNS:CEF フレームワークに DoH を統合するためのベストプラクティス

最終更新日:Nov 09, 2025

このドキュメントでは、Chromium Embedded Framework (CEF) に DNS over HTTPS (DoH) を統合する方法について説明します。

1. はじめに

Chromium Embedded Framework (CEF) は、Chromium をベースとしたオープンソースのフレームワークです。埋め込み Web ブラウジング機能を必要とするデスクトップアプリケーションで広く使用されています。一般的な CEF のシナリオでは、従来のドメインネームシステム (DNS) 解決ではセキュリティ要件を満たせない場合があります。これは、機密データを扱う環境や高いセキュリティが求められる環境では特に当てはまります。DoH は、暗号化された HTTPS チャンネルを介して DNS クエリと応答を送信します。このメソッドは、中間者攻撃、DNS ハイジャック、トラフィックスニッフィング攻撃を効果的に防ぎ、アプリケーションのセキュリティとユーザーのプライバシー保護を向上させます。CEF フレームワークに DoH を統合することで、開発者は既存のアプリケーションロジックを変更することなく、埋め込みブラウザのセキュリティとユーザーエクスペリエンスを大幅に向上させることができます。

2. 前提条件

CEF フレームワークに DoH を統合する前に、「DoH サービスを設定する」の手順を完了していることを確認してください。

説明
  • CEF は、組み込みのプローブドメイン名 google.com を使用して DoH の可用性をチェックします。プローブが完了するまで、DoH の可用性は未確定と見なされます。DoH サービスが正しく機能するように、必ず google.com ドメイン名を解決リストに追加するか、すべてのドメイン名の解決を許可してください

  • CEF バージョン要件: バージョン 115 以降 (Chromium 115+ に対応) を推奨します。

3. 統合手順

CEF フレームワークへの DoH の統合には、3 つのコアステップが含まれます。まず、設定の競合を避けるために、独立したアプリケーションレベルのキャッシュパスを設定します。次に、Preferences API を使用して DoH テンプレートとモードを設定し、暗号化された DNS サービスを有効にします。最後に、自動フォールバックメカニズムを実装して、サービスの安定性を確保します。以下のセクションでは、各ステップの実行方法について説明します。

3.1 CEF アプリケーションのキャッシュパスを設定する

このソリューションでは、独立したアプリケーションレベルのキャッシュパスを設定する必要があります。キャッシュパスを設定せずにデフォルトのパスを使用すると、他の CEF アプリケーションがアプリケーションのキャッシュを汚染する可能性があります。これにより、DoH の設定が失敗したり、上書きされたりする可能性があります。

CEF を初期化する際に、CefSettings オブジェクトを使用してキャッシュパスを設定できます。アプリケーションがこのキャッシュパスにアクセスする権限を持っていることを確認してください。以下のコードは、その例です。

void ConfigureCachePath(CefSettings& settings) {
    // ルートキャッシュパスを設定
    std::string cache_path;
    
#if defined(OS_MAC)
    cache_path = std::string("/Users/") + getenv("USER") + "/Library/Application Support/YourAppName/cache";
#elif defined(OS_WIN)
    cache_path = std::string(getenv("LOCALAPPDATA")) + "\\YourAppName\\cache";
#else
    cache_path = std::string(getenv("HOME")) + "/.cache/YourAppName";
#endif
    
    CefString(&settings.root_cache_path) = cache_path;
    CefString(&settings.cache_path) = cache_path;
}

// main 関数で使用
int main(int argc, char* argv[]) {
    CefSettings settings;

    // その他のパラメーター設定
    // ...
    
    ConfigureCachePath(settings);
    
    // CEF を初期化
    CefInitialize(main_args, settings, app.get(), nullptr);
    // ...
}

3.2 Preferences を使用して DoH を設定する

CefPreferenceManager を使用して DoH を設定できます。以下のコードは、その例です。

void UpdateDnsOverHttpsTemplate(const std::string& new_template) {
    // グローバルな CefPreferenceManager インスタンスを取得
    CefRefPtr<CefPreferenceManager> pref_manager = 
        CefPreferenceManager::GetGlobalPreferenceManager();
    
    // DoH テンプレートを設定
    CefRefPtr<CefValue> template_value = CefValue::Create();
    template_value->SetString(new_template);
    
    // DoH モードを "secure" に設定
    CefRefPtr<CefValue> mode_value = CefValue::Create();
    mode_value->SetString("secure");
    
    // 設定を適用
    CefString error;
    pref_manager->SetPreference("dns_over_https.mode", mode_value, error);
    pref_manager->SetPreference("dns_over_https.templates", template_value, error);
}

// アプリケーションの初期化中に呼び出し
void OnContextInitialized(CefRefPtr<ClientAppBrowser> app) override {
    // これを独自の専用 DoH エンドポイントに置き換える
    UpdateDnsOverHttpsTemplate("https://1xxxx3.aliyunhttpdns.com/dns-query");
}

3.3 自動フォールバックメカニズムを実装する

CEF は、以下の DoH モードをサポートしています。

  • secure: DoH の使用を強制します。標準 DNS へのフォールバックは許可されません。

  • automatic: 自動モード。DoH が失敗した場合、標準 DNS へのフォールバックを許可します。

  • off: DoH を無効にします。

アプリケーションの可用性を向上させるために、自動フォールバックメカニズムを実装できます。このメカニズムは、DoH 解決が失敗した場合に自動的にローカル DNS に切り替えます。以下のコードは、実装例です。

void ClientHandler::OnLoadError(CefRefPtr<CefBrowser> browser,
                                CefRefPtr<CefFrame> frame,
                                ErrorCode errorCode,
                                const CefString& errorText,
                                const CefString& failedUrl) {
  // DNS 関連のエラーをチェック
  if (errorCode == ERR_NAME_NOT_RESOLVED ||
      errorCode == ERR_NAME_RESOLUTION_FAILED) {
    LOG(ERROR) << "DNS resolution failed for URL: " << failedUrl.ToString()
              << ". Error code: " << errorCode
              << ". Switching to Local DNS...";

    // グローバルな preference manager を取得
    CefRefPtr<CefPreferenceManager> pref_manager =
        CefPreferenceManager::GetGlobalPreferenceManager();

    // ローカル DNS の使用を許可するために自動モードに切り替え
    CefRefPtr<CefValue> new_mode = CefValue::Create();
    new_mode->SetString("automatic");

    CefString error;
    if (pref_manager->SetPreference("dns_over_https.mode", new_mode, error)) {
      // 失敗したページの読み込みを再試行
      frame->LoadURL(failedUrl);
      return;
    }
  }
  // その他のエラーを処理...
}

4. まとめ

このドキュメントの手順に従うことで、DoH 機能を CEF フレームワークに正常に統合できます。これにより、アプリケーションのセキュリティとプライバシー保護機能が大幅に向上します。設定後、DoH が正常に統合されたことを確認できます。これを行うには、ネットワークパケットをキャプチャして HTTPS リクエストを表示したり、DNS ログを確認したり、ネットワーク障害テストを実行したりします。本番環境での安定性を確保するために、automatic モードを使用し、複数の DoH サーバーを設定してください。