アップル製OSでは安全でないhttp:サイトへ接続できない
Swiftでアプリケーションを制作していて早速つまづいた。なぜかSSL通信(https://)ではないhttpのサイトに接続できない。調べるとATSというアップル独自のセキュリティを導入しているためで、同時にその解除の方法も提供している。
ただ、 アプリを申請するときにその解除の理由に正当性がないといけないらしい。現在ではログイン情報などを入力するサイトにはhttpを使用することは通例では考えられないため、仮にこうしたアプリを申請しても接続対象となるサイトさえ明示して情報漏洩の恐れがなけれ通過するのではないかと思われる。
やはりアップルはセキュリティにかなりシビアなのだと痛感した。
SSLでない接続をするときのXcodeでの設定
では、Xcodeでプログラムしていて実際どうやってATSを解除して接続するのだろうか?
やってみると簡単だ。文章で説明する。
Xcode上でプロジェクトを開いた状態にする。
- 画面左側プロジェクトナビケーターのリスト最上段にあるプロジェクト名をクリックすると、右側画面に InfoタブのあるiOSターゲットプロパティが表示される。
- infoタブをクリックすると「custom iOS target properties」が表示される。
- リストにある既存の項目を選択した状態で右クリックを押し、Add Rowを選択する。新しいリストが選択可能な状態になる。
- App Transport Security Settingsを選ぶ。
- 追加されたApp Transport Security Settingsという項目の左側にある矢印を下にした状態で右クリックをおす(下矢印にしないと配下にRowが追加されない)。そして、Add Rowを選択。
- 再び自動で選択項目が表示される。Exception Domainsを選びエンターを押す。
- Exception Domains項目の左側矢印を下にして、右クリックしてAdd Rowを選ぶ。
- New Itemという項目が配下にできたら、http接続したいドメイン名を
http://
を抜いて入力する。 例:http://www.example.com -> www.example.com
ここはIPアドレスでもOKだ。 - ドメインを入力したら、エンターを押し、そのTypeをDictionaryに設定する。
-
www.example.com
という項目ができたら左側の矢印を下に向ける。その状態で右クリックしAdd Rowを選択する。 - 配下にnew Itemができて、その名前を「NSExceptionAllowsInsecureHTTPLoads」と入力する。
- さらにNSExceptionAllowsInsecureHTTPLoadsという項目のTypeをBooleanに変更する。
- NSExceptionAllowsInsecureHTTPLoadsのValueをNo(False)からYes(True)に変更する。
- 解除が必要なドメインが複数あればException Domainsの配下に追加する。
以上の手順で任意のサイトでATS制限を解除できる。これらの設定はxml形式でinfo.plistというファイルに書き込まれる。アップルのサイトからドメインに関するATS解除設定を下記に記す。
NSExceptionDomains : Dictionary {
<domain-name-or-ip-address-string> : Dictionary {
NSIncludesSubdomains : Boolean
NSExceptionAllowsInsecureHTTPLoads : Boolean
NSExceptionMinimumTLSVersion : String
NSExceptionRequiresForwardSecrecy : Boolean
}
}