ATS例外設定について

  • iOS
  • ATS
  • HTTPS
  • TLS

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

ATS(App Transport Security)を特定ドメインだけ例外にする書き方を整理しておく。

全部無効にする書き方

一番乱暴なのはこれ。全ドメインに対して非HTTPS通信を許可する。

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

NSAllowsArbitraryLoadsをtrueにするとATSそのものが機能しなくなる。開発中の一時しのぎとしては手軽だけど、リリースするアプリでこれを使う理由は基本的にない。

ドメイン単位で例外にする書き方

特定のドメインだけATSの対象外にしたい場合はNSExceptionDomainsで個別に指定する。

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>xxxxxxx.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>

各キーの役割はこんな感じ。

  • NSIncludesSubdomains:サブドメインにも同じ例外設定を適用するかどうか
  • NSExceptionAllowsInsecureHTTPLoads:このドメインに対してHTTP(非HTTPS)通信を許可するかどうか
  • NSExceptionRequiresForwardSecrecy:Forward Secrecyを必須にするかどうか。falseにすると要件を緩める

全体無効化と違って、影響範囲を指定したドメインだけに絞れるので、対応できないサーバーが一部だけある場合はこちらを使う方がいい。

補足:Temporary付きのキー名について

古いメモや古い記事だとNSTemporaryExceptionAllowsInsecureHTTPLoadsやNSTemporaryExceptionRequiresForwardSecrecyのように、頭にTemporaryが付いたキー名を見かけることがある。

これはiOS 9のbeta1時点で使われていたキー名らしく、正式リリース(beta2以降)でTemporaryが外れた名前に変更されている。意味や構造は変わっていないので、単純に名前だけの違い。

  • NSTemporaryExceptionAllowsInsecureHTTPLoads → NSExceptionAllowsInsecureHTTPLoads
  • NSTemporaryExceptionRequiresForwardSecrecy → NSExceptionRequiresForwardSecrecy
  • NSTemporaryExceptionMinimumTLSVersion → NSExceptionMinimumTLSVersion

古い情報をそのままコピペするとTemporary付きのキーは無視されて期待通り動かない可能性があるので、見かけたら現行のキー名に読み替える必要がある。