Apple の iOS9 で、あらゆる種類のサーバーへの SSL リクエストを制限するという新しいセキュリティ機能が導入されたため、問題が発生しています。
実際には、デフォルトを利用して、いかなる種類の接続も許可しないようにしたい NSAllowsArbitraryLoads: false
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
</dict>
もちろん、いくつかの接続は意図されており、独自のサーバーだけでなくサードパーティのサーバーからもデータを取得します。
サードパーティのツールによって生成されたアプリのトラフィックをスニッフィングするか、ここで参照されているすべてのネットワーク トラフィックのログ記録を利用することができます。App Transport Security によってブロックされている URL を確認するにはどうすればよいですか?
このログで発生したすべてのエラーを追跡するのは簡単です (エラー コードを探すのはそれほど難しくありません)。この方法で、どの接続が確立されているか、また負荷制限により失敗した可能性があるかを簡単に確認できました (もちろん、優秀なソフトウェア エンジニアはこれを熟知しています ;) )
Google Analytics にもかかわらず、サードパーティのトラッカーや独自のネットワーク設定は問題なく動作しています。最初に最新のサンプルコードをダウンロードして確認しましたが、もちろんライブラリが最新のベータシステムをサポートしているとは期待できませんが、試してみました。NSAllowsArbitraryLoads が false/NO に設定されるや否や失敗しました。
サードパーティを可能な限り制限しても、実行できませんでした。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>ssl.google-analytics.com</key>
<dict>
<key>NSRequiresCertificateTransparency</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
また、google-analytics.comを試し、サブドメインを含めるためにNSIncludesSubdomains:trueを設定しました。そして、ブラウザで「https://google-analytics.com「は」にリダイレクトしますhttps://www.google.com/analytics/「google.com を追加の例外ドメインとして許可しようとしましたが、これも失敗しました。
サポートされている SSL 暗号を調べましたが、ここでは問題はないと思います。
nmap --script ssl-enum-ciphers -p 443 ssl.google-analytics.com
| TLSv1.2:
| ciphers:
| TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (dh 256) - C
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (dh 256) - A
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (dh 256) - A
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (dh 256) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (dh 256) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (dh 256) - A
| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (dh 256) - A
| TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (dh 256) - A
| TLS_ECDHE_RSA_WITH_RC4_128_SHA (dh 256) - A
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A
したがって、次のようなリクエストでは、Google Analytics トラッキングは失敗します。https://ssl.google-analytics.com/collect?[....]
誰か解決策を思いついたり、私のアプローチに何らかの間違いを見つけたりした人はいますか?
ベストアンサー1
実際、上記の構成は少し間違っていましたが、機能するアプローチを見つけました。
-- 短編小説の始まり --
基本的に、上記のアプローチはほぼ正しかったのですが、Mac OS 10.10とOS 10.11から確立されたネットワーク接続を確認したときに、構成を再度確認する必要がありました。
openssl s_client -connect ssl.google-analytics.com:443 -status
Mac OS 10.10ではTLSv1.2が使用されていましたが、Mac OS 10.11では何らかの理由でTLSv1.0が使用されていました。
-- 短編小説終了 --
そこで、属性を再検討した後、NSRequiresCertificateTransparency
デフォルトも true ではなく false に設定されていたため、証明書の透明性を削除しました。次の構成が機能するようになりました。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key>ssl.google-analytics.com</key>
<dict>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
追加メモ: Google はこの「実験的な標準」(証明書の透明性) を活用していますが、https://en.wikipedia.org/wiki/証明書の透明性Google Analyticsでは利用されていないようです:-)