Takahiro Octopress Blog

-1から始める情弱プログラミング

iOS9 App Transport Securityについて

iOS9のApp Transport Securityについて調べてみた

さて、今月、最終日になんとかブログ更新です。
来週、新型iPhoneの発表が期待される中、開発者間で話題となっているApp Transport Security(以下、ATS)について調べてみました。

ATSの詳細はiOS9 ATS問題などで既に詳しく書かれていますので、割愛します。
どちらかと言うと実開発よりで話をしたいと思います。

これまで筆者はiOSアプリを作り続けてきたわけなんですが、実は会社では所謂ハイブリッドアプリと呼ばれる、 WebViewを用いたアプリ の開発をすることが多く、古くからあるUIWebViewはもちろんのことWKWebViewも利用してきました。
正直、これまで特別な場合を覗いて、 HTTPS を意識することはありませんでした。
しかし、昨今のセキュリティ問題から周りの考え方も変わりつつあります。
それをさらに一押したのが、iOS9のATSではないかと考えています。
今後は、グローバルに空いているサーバに対しては HTTPS しか許されないことになることでしょう。

iOS8でのWKWebViewにおける自己証明書について

iOS9の具体的な話に入る前に一言だけ。
周知のことかもしれませんが、iOS8のWKWebViewでは自己証明書を利用したサーバの https から始まるURLを指定することはできません。
指定したとしても、表示することができません。
これはstackoverflow – Allow unverified ssl certificates in WKWebViewに書かれている通り、WKNavigationDelegate Protocolである didReceiveAuthenticationChallenge メソッドが呼ばれないためです。

iOS8が登場した当初はバグでは?と騒がれていましたが、iOS9での HTTPS 推奨の流れから見るに、わざとだったのでは?とも勘ぐれますね…。

iOS9でのWKWebViewにおける自己証明書について

iOS9からは didReceiveAuthenticationChallenge メソッドを通るらしく、コードを書くことで、自己証明書を利用したHTTPS通信が可能なようです。
iOS9からWKWebViewのSSL/TLS接続はコードで制御するを参照のこと。
確かに、問題なく、実行できることを確認しました。

iOS9でのHTTP通信許可方法について

Info.plistに下記の設定を入れることで、全てのHTTP通信を許可できます。

1
2
3
4
5
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

流石に全てを許可するのははばかられるといった場合にはHTTP通信を許可するドメインを指定することもできます。

1
2
3
4
5
6
7
8
9
10
11
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
      <key>xxx.com</key>
      <dict>
          <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
          <true/>
      </dict>
  </dict>
</dict>

しかし、これには注意が必要です。
もしも、指定したドメインアクセス時に呼び出されるHTMLファイルの中に、外部ドメインから取得しているJavaScriptファイルがあった場合、それらもInfo.plistに指定する必要があります。
これまで、WebソースはAppleの審査を介さずとも変更が可能な範疇でしたが、HTTP通信として設定を必要とする場合が出てくるため、十分に注意が必要です。
HTTP, HTTPSのどちらでもソースが取得できる場合は、Info.plistにHTTP通信用のドメインとして登録するのではなく、下記のように https からパスを指定した方が良いでしょう。

1
<script type="text/javascript" src="https://〜"></script>

本日は試してみたことをパパっと書きましたが、時間があるときにもっと探ってみようと思います。
と言ったところで本日はここまで。

Comments