1page.title=ネットワーク セキュリティ構成 2page.keywords=androidn,security,network 3page.image=images/cards/card-nyc_2x.jpg 4 5@jd:body 6 7<div id="tb-wrapper"> 8<div id="tb"> 9 10<h2>このドキュメントの内容</h2> 11<ol> 12 <li><a href="#manifest">セキュリティ構成ファイルの追加</a></li> 13 <li><a href="#CustomTrust">信頼できる CA のカスタマイズ</a> 14 <ol> 15 <li><a href="#ConfigCustom">カスタムの CA の設定</a></li> 16 <li><a href="#LimitingCas">信頼できる CA の制限</a></li> 17 <li><a href="#TrustingAdditionalCas">信頼できる CA の追加</a></li> 18 </ol> 19 </li> 20 <li><a href="#TrustingDebugCa">デバッグ限定の CA</a></li> 21 <li><a href="#UsesCleartextTraffic">クリアテキスト トラフィックのオプトアウト</a></li> 22 <li><a href="#CertificatePinning">証明書のピン留め</a></li> 23 <li><a href="#ConfigInheritance">構成の継承の動作</a></li> 24 <li><a href="#FileFormat">構成ファイルの形式</a></li> 25</ol> 26</div> 27</div> 28 29 30<p> 31 Android N には、ネットワーク セキュリティ構成機能が含まれています。これにより、アプリのコードを修正しなくても、安全な宣言型構成ファイルで、アプリのネットワーク セキュリティの設定をカスタマイズできます。 32 33これらの設定は、特定のドメインおよび特定のアプリに対して構成できます。 34主な機能は次のとおりです。 35 36</p> 37 38<ul> 39 <li> 40 <b>カスタム トラスト アンカー:</b>アプリのセキュアな接続にどの証明機関(CA)を信頼するかをカスタマイズできます。 41たとえば、特定の自己署名証明書や制限された一連の公的 CA を信頼できます。 42 43 44 </li> 45 46 <li> 47 <b>デバッグのみのオーバーライド:</b>インストール ベースに対する追加リスクなしに、アプリのセキュアな接続を安全にデバッグできます。 48 49 </li> 50 51 <li> 52 <b>クリアテキスト トラフィックのオプトアウト:</b>クリアテキスト トラフィックの意図しない使用からアプリを保護できます。 53 54 </li> 55 56 <li> 57 <b>証明書のピン留め:</b>アプリのセキュアな接続を特定の証明書に制限します。 58 59 </li> 60</ul> 61 62 63<h2 id="manifest">セキュリティ構成ファイルの追加</h2> 64 65<p> 66 ネットワーク セキュリティ構成機能は、XML ファイルを使用します。このファイルで、アプリの設定を指定できます。 67アプリのマニフェストに、このファイルを指すエントリを含める必要があります。 68次のコードはマニフェストからの抜粋で、このエントリの作成方法を示しています。 69 70</p> 71 72<pre> 73<?xml version="1.0" encoding="utf-8"?> 74<manifest ... > 75 <application ... > 76 <meta-data android:name="android.security.net.config" 77 android:resource="@xml/network_security_config" /> 78 ... 79 </application> 80</manifest> 81</pre> 82 83<h2 id="CustomTrust">信頼できる CA のカスタマイズ</h2> 84 85<p> 86 アプリで、プラットフォームのデフォルトの設定ではなく、カスタマイズした一連の CA を信頼することが必要な場合があります。 87主な理由は次のとおりです。 88</p> 89 90<ul> 91 <li>カスタムの証明機関(自己署名、社内の CA で発行など)を使用してホストに接続する。 92 93 </li> 94 95 <li>プレインストールされたすべての CA ではなく、信頼する一部の CA のみに制限する。 96 97 </li> 98 99 <li>システムに含まれていない追加の CA を信頼する。 100 </li> 101</ul> 102 103<p> 104 デフォルトで、すべてのアプリのセキュアな接続(TLS、HTTPS など)は、システムにプレインストールされた CA を信頼し、API レベル 23(Android M)以下をターゲットにしたアプリは、ユーザーが追加した CA も信頼します。 105 106アプリは {@code base-config}(アプリ全体のカスタマイズ)または {@code domain-config} (ドメイン単位のカスタマイズ)を使用して、独自の接続をカスタマイズすることもできます。 107 108 109 110</p> 111 112 113<h3 id="ConfigCustom">カスタムの CA の設定</h3> 114 115<p> 116 自己署名 SSL 証明書を使用するホストか、または信頼できる非パブリック CA(社内の CA など)によって SSL 証明書が発行されているホストに接続するケースで説明します。 117 118 119</p> 120 121<p> 122 <code>res/xml/network_security_config.xml</code>: 123<pre> 124<?xml version="1.0" encoding="utf-8"?> 125<network-security-config> 126 <domain-config> 127 <domain includeSubdomains="true">example.com</domain> 128 <trust-anchors> 129 <certificates src="@raw/my_ca"/> 130 </trust-anchors> 131 </domain-config> 132</network-security-config> 133</pre> 134</p> 135 136<p> 137 PEM または DER 形式で、自己署名または非パブリック CA 証明書を 138{@code res/raw/my_ca} に追加します。 139</p> 140 141 142<h3 id="LimitingCas">信頼できる CA の制限</h3> 143 144<p> 145 システムによって信頼されているすべての CA をアプリで信頼したくない場合は、信頼する CA を制限できます。 146これにより、他の CA が発行した偽造証明書からアプリを保護できます。 147 148</p> 149 150<p> 151 信頼できる CA を制限するための設定は、特定のドメインで<a href="#TrustingACustomCa">カスタムの CA を信頼する</a>設定と似ています。ただし、リソースで複数の CA を指定できる点が異なります。 152 153</p> 154 155<p> 156<code>res/xml/network_security_config.xml</code>: 157<pre> 158<?xml version="1.0" encoding="utf-8"?> 159<network-security-config> 160 <domain-config> 161 <domain includeSubdomains="true">secure.example.com</domain> 162 <domain includeSubdomains="true">cdn.example.com</domain> 163 <trust-anchors> 164 <certificates src="@raw/trusted_roots"/> 165 </trust-anchors> 166 </domain-config> 167</network-security-config> 168</pre> 169</p> 170 171<p> 172 PEM または DER 形式で、信頼できる CA を {@code res/raw/trusted_roots} に追加します。 173 PEM 形式を使用する場合、そのファイルには PEM データのみを含めるようにして、余分なテキストを含めないでください。<em></em> 1741 つだけでなく複数の 175<a href="#certificates"><code><certificates></code></a> 要素を指定できます。 176 177</p> 178 179 180<h3 id="TrustingAdditionalCas"> 181 信頼できる CA の追加 182</h3> 183 184<p> 185 システムで信頼されていない CA を、アプリが追加で信頼しなければならない場合があります。これは、システムに CA がまだ組み込まれていなかったり、CA が Android システムに組み込まれるための要件を満たしていないことが原因です。 186 187CA を追加するには、アプリの構成で複数の証明書ソースを指定します。 188 189 190</p> 191<p> 192<code>res/xml/network_security_config.xml</code>: 193<pre> 194<?xml version="1.0" encoding="utf-8"?> 195<network-security-config> 196 <base-config> 197 <trust-anchors> 198 <certificates src="@raw/extracas"/> 199 <certificates src="system"/> 200 </trust-anchors> 201 </base-config> 202</network-security-config> 203</pre> 204</p> 205 206 207<h2 id="TrustingDebugCa">デバッグ用の CA の構成</h2> 208 209<p> 210 HTTPS で接続するアプリをデバッグするときは、運用サーバーの SSL 証明書がインストールされていないローカルの開発サーバーへの接続が必要になります。 211 212アプリのコードを変更せずにこの接続をサポートするには 213 214 <i>、</i> {@code debug-overrides} を使用して、<a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a> が {@code true} の場合にのみ信頼されるデバッグ限定の CA を指定できます。 215 216通常、IDE およびビルド ツールによって、非リリース ビルドには自動的にこのフラグが設定されます。 217 218</p> 219 220<p> 221 この方法は、通常の条件付きコードよりも安全です。セキュリティ対策として、アプリ ストアでは debuggable とマークされたアプリは拒否されるからです。 222 223 224</p> 225 226<p> 227<code>res/xml/network_security_config.xml</code>: 228<pre> 229<?xml version="1.0" encoding="utf-8"?> 230<network-security-config> 231 <debug-overrides> 232 <trust-anchors> 233 <certificates src="@raw/debug_cas"/> 234 </trust-anchors> 235 </debug-overrides> 236</network-security-config> 237</pre> 238</p> 239 240 241<h2 id="UsesCleartextTraffic">クリアテキスト トラフィックのオプトアウト</h2> 242 243<p> 244 アプリケーションで、セキュアな接続のみを使用して接続する場合、それらの接続先に対して(HTTPS ではなく暗号化されていない HTTP プロトコルを使用する)クリアテキストのサポートを除外できます。 245 246このオプションにより、バックエンド サーバーなど外部ソースが提供する URL の変更によって、アプリで思わぬパフォーマンスの低下が発生するのを防ぐことができます。 247 248 249 詳細については、{@link android.security.NetworkSecurityPolicy#isCleartextTrafficPermitted 250 NetworkSecurityPolicy.isCleartextTrafficPermitted()} をご覧ください。 251</p> 252 253<p> 254 たとえば、アプリで {@code 255 secure.example.com} へのすべての接続には常に HTTPS を使用して、機密性の高いトラフィックを有害なネットワークから保護することが必要な場合があります。 256 257</p> 258 259<p> 260<code>res/xml/network_security_config.xml</code>: 261<pre> 262<?xml version="1.0" encoding="utf-8"?> 263<network-security-config> 264 <domain-config usesCleartextTraffic="false"> 265 <domain includeSubdomains="true">secure.example.com</domain> 266 </domain-config> 267</network-security-config> 268</pre> 269</p> 270 271 272<h2 id="CertificatePinning">証明書のピン留め</h2> 273 274<p> 275 通常、アプリはプレインストールされたすべての CA を信頼します。これらの CA が偽造証明書を発行すると、アプリは MiTM 攻撃のリスクにさらされます。 276 277アプリによっては、信頼する CA を制限するか証明書をピン留めすることで、受け入れる証明書を制限できます。 278 279</p> 280 281<p> 282 証明書をピン留めするには、公開鍵のハッシュによって証明書のセットを指定します(X.509 証明書の SubjectPublicKeyInfo)。 283証明書チェーンが有効になるのは、証明書チェーンに 1 つ以上のピン留めされた公開鍵が含まれている場合のみです。 284 285 286</p> 287 288<p> 289 証明書のピン留めを使用するときは、必ずバックアップの鍵を含めてください。そうすれば、新しい鍵に切り替えたり、CA を変更したりする必要が生じた場合に(CA 証明書またはその CA の中間証明書にピン留めしていても)、アプリの接続が影響を受けることはありません。 290 291 292そうしないと、接続を復元するためにアプリにアップデートをプッシュしなければならなくなります。 293 294</p> 295 296<p> 297 また、ピン留めの有効期限を設定することもできます。その有効期限を過ぎると、ピン留めが無効になります。 298これにより、アップデートされていないアプリの接続の問題を防ぐことができます。 299ただし、ピン留めに有効期限を設定すると、ピン留めを回避できるようになります。 300 301</p> 302 303<p> 304<code>res/xml/network_security_config.xml</code>: 305<pre> 306<?xml version="1.0" encoding="utf-8"?> 307<network-security-config> 308 <domain-config> 309 <domain includeSubdomains="true">example.com</domain> 310 <pin-set expiration="2018-01-01"> 311 <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin> 312 <!-- backup pin --> 313 <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin> 314 </pin-set> 315 </domain-config> 316</network-security-config> 317</pre> 318</p> 319 320 321<h2 id="ConfigInheritance">構成の継承の動作</h2> 322 323<p> 324 固有の構成で設定されていない値は、継承されます。この動作により、より複雑な構成が可能になるうえ、構成ファイルの読みやすさを維持できます。 325 326</p> 327 328<p> 329 固有のエントリに値が設定されていない場合、その次に汎用的なエントリの値が使用されます。 330{@code domain-config} で設定されていない値は、ネストされている場合は親の {@code domain-config} から、ネストされていない場合は {@code 331 base-config} から取得されます。 332{@code base-config} で設定されていない値には、プラットフォームの既定値を使用します。 333 334</p> 335 336<p> 337 たとえば、{@code 338 example.com} のサブドメインに対するすべての接続で、CA のカスタム セットを使用する必要があるケースを考えてみましょう。また、これらのドメインに対するクリアテキストのトラフィックは、{@code 339 secure.example.com} に接続する場合を除いて許可します。<em></em> 340{@code example.com} の構成で {@code 341 secure.example.com} の構成をネストすることで、 342{@code trust-anchors} の重複を回避できます。 343</p> 344 345<p> 346<code>res/xml/network_security_config.xml</code>: 347<pre> 348<?xml version="1.0" encoding="utf-8"?> 349<network-security-config> 350 <domain-config> 351 <domain includeSubdomains="true">example.com</domain> 352 <trust-anchors> 353 <certificates src="@raw/my_ca"/> 354 </trust-anchors> 355 <domain-config cleartextTrafficPermitted="false"> 356 <domain includeSubdomains="true">secure.example.com</domain> 357 </domain-config> 358 </domain-config> 359</network-security-config> 360</pre> 361</p> 362 363 364<h2 id="FileFormat">構成ファイルの形式</h2> 365 366<p> 367 ネットワーク セキュリティ構成機能では、XML ファイル形式を使用します。 368 ファイルの全体的な構造については、次のコード サンプルをご覧ください。 369</p> 370 371<pre> 372<?xml version="1.0" encoding="utf-8"?> 373<network-security-config> 374 <base-config> 375 <trust-anchors> 376 <certificates src="..."/> 377 ... 378 </trust-anchors> 379 </base-config> 380 381 <domain-config> 382 <domain>android.com</domain> 383 ... 384 <trust-anchors> 385 <certificates src="..."/> 386 ... 387 </trust-anchors> 388 <pin-set> 389 <pin digest="...">...</pin> 390 ... 391 </pin-set> 392 </domain-config> 393 ... 394 <debug-overrides> 395 <trust-anchors> 396 <certificates src="..."/> 397 ... 398 </trust-anchors> 399 </debug-overrides> 400</network-security-config> 401</pre> 402 403<p> 404 次のセクションでは、このファイル形式の構文とその他の詳細について説明します。 405 406</p> 407 408<h3 id="network-security-config"> 409 <network-security-config> 410</h3> 411 412<dl class="xml"> 413 <dt> 414 含めることのできる要素: 415 </dt> 416 417 <dd> 418 0 または 1 つの <code><a href="#base-config"><base-config></a></code><br> 419 任意の数の <code><a href= 420 "#domain-config"><domain-config></a></code><br> 421 0 または 1 つの <code><a href="#debug-overrides"><debug-overrides></a></code> 422 </dd> 423</dl> 424 425<h3 id="base-config"> 426 <base-config> 427</h3> 428 429<dl class="xml"> 430 <dt> 431 構文: 432 </dt> 433</dl> 434 435<pre class="stx"> 436<base-config <a href= 437"#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]> 438 ... 439</base-config> 440</pre> 441<dl class="xml"> 442 <dt> 443 含めることのできる要素: 444 </dt> 445 446 <dd> 447 <code><a href="#trust-anchors"><trust-anchors></a></code> 448 </dd> 449 450 <dt> 451 説明: 452 </dt> 453 454 <dd> 455 <a href="#domain-config"><code>domain-config</code></a> に含まれていない接続先に対するすべての接続に使用される、デフォルトの構成。 456 457 458<p> 459 設定されていない値はすべて、プラットフォームの既定値を使用します。API レベル 24 以上をターゲットにしたアプリのデフォルトの構成は次のとおりです。 460 461</p> 462 463<pre> 464<base-config usesCleartextTraffic="true"> 465 <trust-anchors> 466 <certificates src="system" /> 467 </trust-anchors> 468</base-config> 469</pre> 470API レベル 23 以下をターゲットにしたアプリのデフォルトの構成は次のとおりです。 471<pre> 472<base-config usesCleartextTraffic="true"> 473 <trust-anchors> 474 <certificates src="system" /> 475 <certificates src="user" /> 476 </trust-anchors> 477</base-config> 478</pre> 479 480 </dd> 481</dl> 482 483<h3 id="domain-config"><domain-config></h3> 484<dl class="xml"> 485<dt>構文:</dt> 486<dd> 487<pre class="stx"><domain-config <a href="#usesCleartextTraffic">usesCleartextTraffic</a>=["true" | "false"]> 488 ... 489</domain-config></pre> 490</dd> 491 492<dt>含めることのできる要素:</dt> 493 494<dd> 4951 つ以上の <code><a href="#domain"><domain></a></code> 496<br/>0 または 1 つの <code><a href="#trust-anchors"><trust-anchors></a></code> 497<br/>0 または 1 つの <code><a href="#pin-set"><pin-set></code></a> 498<br/>任意の数のネストされた <code><domain-config></code></dd> 499 500<dt>説明</dt> 501<dd>固有の接続先への接続に使用される構成です。{@code domain} 要素の定義に従います。 502 503<p>複数の {@code domain-config} 要素で接続先を指定している場合は、最も具体的な(長い)マッチング ドメイン ルールを持つ構成が採用されます。 504</p></dd> 505</dl> 506 507 508<h3 id="domain"><domain></h3> 509 510<dl class="xml"> 511 <dt> 512 構文: 513 </dt> 514 515 <dd> 516 <pre class="stx"> 517<domain includeSubdomains=["true" | "false"]>example.com</domain> 518</pre> 519 </dd> 520 521 <dt> 522 属性: 523 </dt> 524 525 <dd> 526 <dl class="attr"> 527 <dt> 528 {@code includeSubdomains} 529 </dt> 530 531 <dd> 532 {@code "true"} の場合、このドメイン ルールはドメインおよびすべてのサブドメイン(サブドメインのサブドメインも含む)に一致します。そうでない場合、このルールは完全一致のみに適用されます。 533 534 535 </dd> 536 </dl> 537 </dd> 538 539 <dt> 540 説明: 541 </dt> 542</dl> 543 544<h3 id="debug-overrides"><debug-overrides></h3> 545 546<dl class="xml"> 547 <dt> 548 構文: 549 </dt> 550 551 <dd> 552 <pre class="stx"> 553<debug-overrides> 554 ... 555</debug-overrides> 556</pre> 557 </dd> 558 559 <dt> 560 含めることのできる要素: 561 </dt> 562 563 <dd> 564 0 または 1 つの <code><a href="#trust-anchors"><trust-anchors></a></code> 565 </dd> 566 567 <dt> 568 説明: 569 </dt> 570 571 <dd> 572 オーバーライドは、<a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a> が {@code "true"} の場合に適用されます。これは通常、IDE およびビルド ツールで生成された非リリース ビルドに使用します。 573 574{@code 575 debug-overrides} で指定されたトラスト アンカーは、その他すべての構成に追加されます。サーバーの証明書チェーンでデバッグ限定のトラスト アンカーのいずれかを使用するときは、証明書のピン留めは実行されません。 576 577<a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a> が {@code "false"} の場合、このセクションは完全に無視されます。 578 579 </dd> 580</dl> 581 582<h3 id="trust-anchors"><trust-anchors></h3> 583<dl class="xml"> 584 <dt> 585 構文: 586 </dt> 587 588 <dd> 589 <pre class="stx"> 590<trust-anchors> 591... 592</trust-anchors> 593</pre> 594 </dd> 595 596 <dt> 597 含めることのできる要素: 598 </dt> 599 600 <dd> 601 任意の数の <code><a href="#certificates"><certificates></a></code> 602 </dd> 603 604 <dt> 605 説明: 606 </dt> 607 608 <dd> 609 セキュアな接続に使用するトラスト アンカーのセット。 610 </dd> 611</dl> 612 613 614<h3 id="certificates"><certificates></h3> 615<dl class="xml"> 616<dt>構文:</dt> 617<dd><pre class="stx"><certificates src=["system" | "user" | "<i>raw resource</i>"] 618 overridePins=["true" | "false"] /> 619</pre></dd> 620<dt>説明:</dt> 621<dd>{@code trust-anchors} 要素の X.509 証明書のセットです。</dd> 622 623<dt>属性:</dt> 624<dd><dl class="attr"> 625<dt>{@code src}</dt> 626<dd> 627CA 証明書のソースには、次のいずれかを指定します。 628<ul> 629 <li>X.509 証明書を含むファイルを指す未加工のリソース ID。 630 証明書は、DER または PEM 形式でエンコードする必要があります。PEM 証明書の場合、ファイルには PEM 以外の余分なデータ(コメントなど)を含めないでください。 631<em></em> 632 633 </li> 634 635 <li>{@code "system"}: プレインストールされたシステムの CA 証明書 636 </li> 637 638 <li>{@code "user"}: ユーザーが追加した CA 証明書 639 </li> 640</ul> 641</dd> 642 643<dt>{@code overridePins}</dt> 644<dd> 645 <p> 646 ソースから取得した CA が証明書のピン留めを回避するかどうかを指定します。{@code 647 "true"} の場合、証明書チェーンはこのソースから取得したいずれかの CA を使用して作成され、ピン留めは実行されません。 648この設定は、CA をデバッグしたり、アプリのセキュアなトラフィックでユーザーの MiTM の許可をサポートするために役立ちます。 649 650 </p> 651 652 <p> 653 デフォルトは {@code "false"} です。ただし、{@code debug-overrides} 要素で指定された場合の既定値は {@code "true"} です。 654 655 </p> 656</dd> 657</dl> 658</dd> 659 660 661<h3 id="pin-set"><pin-set></h3> 662 663<dl class="xml"> 664 <dt> 665 構文: 666 </dt> 667 668 <dd> 669<pre class="stx"> 670<pin-set expiration="date"> 671... 672</pin-set> 673</pre> 674 </dd> 675 676 <dt> 677 含めることのできる要素: 678 </dt> 679 680 <dd> 681 任意の数の <code><a href="#pin"><pin></a></code> 682 </dd> 683 684 <dt> 685 説明: 686 </dt> 687 688 <dd> 689 公開鍵のピンのセットです。セキュアな接続を信頼するには、信頼チェーン内の公開鍵一式のうちどれかが、ピンのセットに含まれている必要があります。 690ピンの形式については、 691<code><a href="#pin"><pin></a></code> をご覧ください。 692 </dd> 693 694 <dt> 695 属性: 696 </dt> 697 698 <dd> 699 <dl class="attr"> 700 <dt> 701 {@code expiration} 702 </dt> 703 704 <dd> 705 {@code yyyy-MM-dd} 形式のピン留めの有効期限、つまりピン留めを無効にする日付です。 706この属性が設定されていない場合、ピン留めの有効期限はありません。 707 708 <p> 709 有効期限を設定しておくと、ユーザーがアプリのアップデートを無効にしているなどの原因で、ピンのセットのアップデートを取得していないアプリで、アプリの接続上の問題を回避できます。 710 711 712 </p> 713 </dd> 714 </dl> 715 </dd> 716</dl> 717 718<h3 id="pin"><pin></h3> 719<dl class="xml"> 720 <dt> 721 構文: 722 </dt> 723 724 <dd> 725<pre class="stx"> 726<pin digest=["SHA-256"]>base64 encoded digest of X.509 727 SubjectPublicKeyInfo (SPKI)</pin> 728</pre> 729 </dd> 730 731 <dt> 732 属性: 733 </dt> 734 735 <dd> 736 <dl class="attr"> 737 <dt> 738 {@code digest} 739 </dt> 740 741 <dd> 742 PIN の生成にはダイジェスト アルゴリズムが使用されます。現在サポートされているのは 743{@code "SHA-256"} のみです。 744 </dd> 745 </dl> 746 </dd> 747</dl> 748