Xcode 7でビルドしたアプリ(iOS 9)からHTTPSでWebにアクセスしているはずなのに、ATS(App Transport Security)の制限に引っかかり、
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
とのエラーが出て、S3にホストしたコンテンツの読み込みに何故か失敗した。
調べたところ、ATSは以下の暗号化アルゴリズム(Cipher Suite)しかサポートしていないらしい。
(参考: App Transport Security Technote)
サポートするCipher Suite
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
S3のCipher Suiteを調べたら、TLS_ECDHE_RSA_WITH_AES_128_CBC_SHAだった。
$ curl -I -v https://_HOGE_.s3.amazonaws.com/hoge.jpg
...
* Connected to _HOGE_.s3.amazonaws.com (XXX.XXX.XXX.XXX) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA ←←←←←←←←←← ここ
* Server certificate: *.s3.amazonaws.com
* Server certificate: VeriSign Class 3 Secure Server CA - G3
* Server certificate: VeriSign Class 3 Public Primary Certification Authority - G5
> HEAD /hoge.jpg HTTP/1.1
> Host: _HOGE_.s3.amazonaws.com
Info.plistでNSExceptionRequiresForwardSecrecyの設定をNOにすると、TLS_RSA_WITH_AES_128_CBC_SHAのサイトにもアクセスができるようになるとのことなので、以下の設定をした。
(参考: App Transport Security Technote)
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>_HOGE_.s3.amazonaws.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
この設定で無事に、iOS 9端末からS3にホストしたHTTPSのコンテンツを読み込めるようになりました。