View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

WWDC20に戻る

ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。

  • 概要
  • トランスクリプト
  • コード
  • 暗号化DNSの有効化

    App内でWebにアクセスする場合は、そのプライバシーが非常に重要になります。当社のプラットフォーム全体で暗号化DNSを活用することによってその情報を守り、App内でプライベートかつ安全な接続性を提供しましょう。システムのDNS設定を使用して暗号化サーバに接続する、または標準的なネットワークAPIを使用してApp内で暗号化DNSを有効化する方法をご紹介します。 暗号化DNSの有効化は、Appで顧客のプライバシーを保護し、より安全で好ましいエクスペリエンスを提供するためのもう1つの方法でもあります。

    リソース

      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC23

    • プライバシーの新機能

    WWDC22

    • AppとサーバのDNSセキュリティの改善

    WWDC20

    • プライバシーの強化で信頼を築く
    • 最新のネットワーキングによるパフォーマンスとセキュリティの向上
  • このビデオを検索

    ようこそWWDCへ “暗号化DNSの有効化” トミー・パウリです プライバシー保護にDNS暗号化は必須です Appleプラットフォームでは― デベロッパ向けにこの機能が ネイティブサポートされています パブリックDNSサービス提供のために 暗号化したサーバーを使用し アプリや構成プロファイルが作成できます

    アプリ内の特定接続に DNS暗号化のオプトインも可能です DNS暗号化の使用説明に入る前に DNSとプライバシーの重要性を話します DNSとはドメインネームシステム サファリのWebページアドレスを IPアドレスに変換するシステムです インターネットを使用する度に 使用しています アプリ起動時に システムがクエリという質問をし アドレス名に置き換えます 質問はローカルネットワークの DNSサーバーに送られます では プライバシーとの関係性は? 通常 DNSの質問と回答は 未暗号化のUDPで送受信されるので 検索ページがネットワーク上の 外部デバイスに知られる可能性があります 偽装すら可能なのです ローカルネットワークのDNSリゾルバーの 信頼性が低いことも問題で 公共のWi-Fiにアクセスした場合 追跡やブロックされる可能性もあります DNSを暗号化すれば どうでしょう?

    暗号を使い DNSの質問と回答を保護するのです

    ネットワークを信頼できなければ 信頼性の高いDNSサーバーに 質問することもできます

    今年 Appleプラットフォームは DNS暗号化のサポートを開始しました 保護用のプロトコルは2つで DoTと呼ばれるDNS over TLSと DoHと呼ばれるDNS over HTTPSです 両者ともTLSを使用し DNSメッセージを暗号化します さらに DoHはHTTPを使用し パフォーマンスを改善します DNS暗号化には 2通りの方法があります デフォルトのリゾルバーとしてすべてのアプリに 1つのDNSサーバーを選択します そうすれば パブリックDNSサーバーの提供のため システムを設定する NetworkExtensionアプリを作成できます

    もし MDMを使ってデバイス上の エンタープライズ設定を行うのであれば プロファイルをプッシュダウンし ネットワークに対し暗号化を設定できます もう1つは アプリから 直接オプトインする方法です アプリに対してだけでも暗号化を望むなら 特定のサーバーを選択し 選んだアプリの接続に使用できます

    システム全体のDNS設定を説明します NEDNSSettingsManagerを使用する NetworkExtensionアプリか DNSSettingsペイロードを含む MDMプロファイルで設定します

    どちらでも 同じ内容を指定することができます

    サーバーとプロトコルを特定する DNSサーバーコンフィグレーションと 設定のタイミングをカスタマイズする ネットワークルールのセットです

    NetworkExtensionで サーバーコンフィグレーションを指定しましょう

    NEDNSSettingsManagerオブジェクトで 既存のコンフィグレーションでロードします

    そうすれば DoHかDoTサーバーの いずれかの設定を 定義することができます ここではDoHを使用します オプションのサーバーのIPアドレスと 必須のサーバーURLを提供できます これを“dnsSettings”プロパティ内に設定し

    saveToPreferencesをコールし コンフィグレーションをシステムに適用します これでユーザーはDNSサーバーを 設定アプリ内で有効にできます

    次はコンフィグレーションの ネットワークルールに移りましょう ネットワークルールの指定により 別のネットワークとの互換性を保証します 暗号化はプライバシー保護に最適ですが パブリックDNSサーバはローカルネットワーク上 だけのプライベートネームを解決しません つまり エンタープライズWi-Fiネットワーク上の DNSサーバーのみが 従業員がアクセスする プライベートネームを解決します 互換性の中には 自動的に処理されるものもあり ネットワークルールを 指定する必要はありません カフェなどのキャプティブネットワークは 自動的に例外として検出されます 同様にVPNがアクティブだと VPNトンネル内での解決に VPNのDNS設定が使用されます システム全体の設定ではありません

    ただし エンタープライズWi-Fiネットワーク上の プライベートネームを処理するには ネットワークルールの設定が必要です ネットワークルールは Wi-Fiやセルラー特定のWi-Fi SSIDのような ネットワークタイプの挙動を定義します 適合済みのネットワークでは DNS設定を完全に無効にするか 特定のプライベートドメインに対してのみ 例外を与えられます これはアプリ内で ネットワークルールを設定する方法で ユーザーは これらのルール設定が可能となります

    社内ネットワークの例外作成のため 特定SSIDでWi-Fiのルールを定義し 接続ルールの一覧がドメイン 今回はenterprise.example.netを定義します DNS設定を使ってはいけません

    DNS設定は プライベートエンタープライズドメインを除いて すべてに対し 社内Wi-Fiネットワークで使用可能です

    また Disconnectルールでネットワークの カテゴリー全体で設定を無効にできます ここでは セルラーネットワーク上での DNS設定を無効にしています

    そして常に キャッチオールである必要があります ここで Connectルールを使って 設定がデフォルトでオンである確認し

    ネットワークルールを順序付きリストとして 保存してからコンフィグレーションも保存します

    DNS設定アプリの作動を 確認する準備が完了しました

    これはシステム全体のDNS設定を 設定する事例プロジェクトです アプリ内でNEDNSSettingsManagerを使います ここでサーバーコンフィグレーションが定義でき

    ユーザープリファレンスに基づいて ネットワークルールの設定もできます このアプリはセルラーとWi-Fi上で 有効と無効の両方をサポートします

    アプリ実行前にXcodeで DNS設定機能が有効か確認します 確認のため プロジェクト設定の―

    Signing and Capabilitiesに行きます

    DNS設定機能は NetworkExtension機能の1つです システムがサポートする プロトコルを設定するので 拡張ポイントを実行する必要はなく アプリをビルドするだけです

    アプリを実行しましょう

    コンフィグレーションがインストールされますが 即座にアクティブにはなりません

    Wi-Fiやセルラーで 設定を有効か無効にできて 設定アプリ内でコンフィグレーション全体を 有効にします

    “設定”に行きます

    “一般”に行き―

    “VPN接続”を確認します ここがDNSのセクションです インストールが完了するとアプリが表示され

    設定を選択すると システム全体に自動的に適用されます アプリに戻ると コンフィグレーションが アクティブになっています この時点で DNS設定はシステム上の すべてのアプリに適用されます ネットワークによっては ポリシーで 暗号化サーバーをブロックするものもあり クエリを見て トラフィックを フィルタリングする可能性があります これが発生すると Wi-Fiネットワークに プライバシー警告が付きます プライバシー侵害の前に アプリの接続が失敗となります システム全体ではなく アプリ内でDNS暗号化を使いたい場合は アプリ全体や特定の接続に対して 有効にできます この方法は どのAPIでも機能します URLSessionタスクや Networkフレームワーク接続 それにgetaddrinfoのような POSIX APIsでも機能します Networkフレームワークで DNS暗号化を有効にします PrivacyContextでオプションを選択し DNS設定を共有する接続ごとに 1つのPrivacyContextを作成します

    フォールバックを使用するために DNSサーバーコンフィグレーションを提供します システム全体のDNSコンフィグレーションが 優先されます そうでなければ アプリのフォールバックがキックインします DoHサーバーのURLを使用し

    接続のパラメーターの作成に 以前 作成したPrivacyContextを設定します

    接続を開始するとDNS暗号化が使われます

    また 適正な接続が使われたか確認できます

    接続できたら EstablishmentReportをリクエストすると

    解決ステップの一覧があります 使用したプロトコルを確認できます HTTPSやTLSやUDPまたはTCPです キャッシュからの回答にはプロトコルのセットが 入っていない場合もあります アプリ全体を通して使用したいなら デフォルトのPrivacyContextを設定できます アプリで開始されたDNSの解決に コンフィグレーションが適用されます

    それはURLSessionタスクか

    getaddrinfoのような 下層APIを使用する場合です

    DNS暗号化を試す準備はできました パブリックDNSサービスを提供するのであれば NEDNSSettingsManagerでアプリを書いて 設定を供給してください

    エンタープライズMDMソリューションがあるなら プロファイルを使い有効にしてください アプリからオプトインする場合 Network フレームワークでPrivacyContextsを選択 詳細な情報は 次のセッションURLをご確認ください では さようなら

    • 4:16 - Create a DNS configuration

      // Create a DNS configuration
      
      import NetworkExtension
      
      NEDNSSettingsManager.shared().loadFromPreferences { loadError in
          if let loadError = loadError {
              // ...handle error...
              return
          }
          let dohSettings = NEDNSOverHTTPSSettings(servers: [ "2001:db8::2" ])
          dohSettings.serverURL = URL(string: "https://dnsserver.example.net/dns-query")
          NEDNSSettingsManager.shared().dnsSettings = dohSettings
          NEDNSSettingsManager.shared().saveToPreferences { saveError in
              if let saveError = saveError {
                  // ...handle error...
                  return
              }
          }
      }
    • 6:40 - Apply network rules

      // Apply network rules
      
      let workWiFi = NEOnDemandRuleEvaluateConnection()
      workWiFi.interfaceTypeMatch = .wiFi
      workWiFi.ssidMatch = ["MyWorkWiFi"]
      workWiFi.connectionRules =
          [ NEEvaluateConnectionRule(matchDomains: ["enterprise.example.net"],
                                     andAction: .neverConnect) ]
      
      let disableOnCell = NEOnDemandRuleDisconnect()
      disableOnCell.interfaceTypeMatch = .cellular
      
      let enableByDefault = NEOnDemandRuleConnect()
      
      NEDNSSettingsManager.shared().onDemandRules = [
          workWiFi,
          disableOnCell,
          enableByDefault
      ]
    • 10:47 - Use encrypted DNS with NWConnection

      // Use encrypted DNS with NWConnection
      
      import Network
      
      let privacyContext = NWParameters.PrivacyContext(description: "EncryptedDNS")
      if let url = URL(string: "https://dnsserver.example.net/dns-query") {
          let address = NWEndpoint.hostPort(host: "2001:db8::2", port: 443)
          privacyContext.requireEncryptedNameResolution(true,
              fallbackResolver: .https(url, serverAddresses: [ address ]))
      }
      
      let tlsParams = NWParameters.tls
      tlsParams.setPrivacyContext(privacyContext)
      
      let conn = NWConnection(host: "www.example.com", port: 443, using: tlsParams)
      conn.start(queue: .main)
    • 11:35 - Validate which DNS protocol was used

      // Validate which DNS protocol was used
      
      import Network
      
      conn.requestEstablishmentReport(queue: .main) { report in
          if let report = report {
              for resolution in report.resolutions {
                  switch resolution.dnsProtocol {
                  case .https, .tls:
                      print("Used encrypted DNS!”)
                  case .udp, .tcp:
                      print("Used unencrypted DNS")
                  default:
                      // Ignore unknown protocols
             }
          }
      }
    • 12:07 - Use encrypted DNS for other APIs

      // Use encrypted DNS for other APIs
      
      import Network
      
      if let url = URL(string: "https://dnsserver.example.net/dns-query") {
          let address = NWEndpoint.hostPort(host: "2001:db8::2", port: 443)
          NWParameters.PrivacyContext.default.requireEncryptedNameResolution(true,
              fallbackResolver: .https(url, serverAddresses: [ address ]))
      }
      
      let task = URLSession.shared.dataTask(with: ...)
      task.resume()
      
      getaddrinfo(...)

Developer Footer

  • ビデオ
  • WWDC20
  • 暗号化DNSの有効化
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン