個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

Xamarin UIWebViewが真っ白になり何も表示されない。(App Transport Security)

UIWebViewでWebサイトを表示しようとしても画面がが真っ白になり何も表示されないので調べてみたら、
iOS 9以上で動かした場合はHTTP接続はブロックされてしまうことがわかりました。

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

次にHTTPSで接続するようにしてみたところ下記の2つのエラーが発生してしまいました。

CFNetwork SSLHandshake failed (-9824)
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)

HTTPS接続にしても接続先がApp Transport Securityの要件を満たしていない限りエラーになります。

https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html

上記 URLによると、ATSの要件は、下記のとおりです。

1.サーバ証明書は、以下の信頼の要件のうち少なくとも一つを満たしていること。

 ・サーバ証明書を発行した認証局ルート証明書がサーバのOSにインストール済であること。
 ・サーバ証明書がユーザーまたはシステム管理者によって信頼済ルート認証局によって発行され、インストールされていること。

2.TLS 1.2以上で通信できること。

3.暗号スイートがForward secrecyに対応していること、かつ以下のもののどれかであること。

 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

4.リーフ証明書は次のいずれかのタイプのキーで署名すること。

 RSA2048bit以上
 ECC256bit以上

 ※リーフ証明書のハッシュアルゴリズムがSHA-256またはそれ以上であること

まとめるとエラーが起きなくするには、以下の通りの対処が必要となります。(推奨される方法順)

1. 接続先のサーバが上記要件を満たすようにする。
2. 特定のドメインだけATSを無効にする。

info.plist に下記の設定を追加

<key>NSAppTransportSecurity</key>
<dict>
	<key>NSExceptionDomains</key>
	<dict>
		<key>www.exanple.com</key>
		<dict>
			<key>NSExceptionAllowsInsecureHTTPLoads</key>
			<true/>
		</dict>
	</dict>
</dict>

3. ATSを完全無効にする。

info.plist に下記の設定を追加

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

以上です。