iOS9 GoogleAnalytics和NSAppTransportSecurity

Lep*_*ron 20 ssl google-analytics ios swift ios9

由于Apple iOS9的新安全机会将ssl请求限制在任何类型的服务器上,我遇到了麻烦.

参见参考:https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33

实际上,我想利用默认值而不允许任何类型的连接NSAllowsArbitraryLoads:false

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <false/>
    </dict>
Run Code Online (Sandbox Code Playgroud)

当然有些连接是我们想要的,我从自己的服务器以及第三方服务器检索数据.

您现在可以嗅探应用程序的流量,这是由第三方工具生成的,或者您使用记录所有网络流量,在此处引用: 如何确定哪个URL被App Transport Security阻止?

很容易跟踪此日志中发生的所有错误(不太难以查找错误代码).通过这种方式,由于负载限制(当然,优秀的软件工程师心里明白;),我很容易看到正在建立的连接并且可能失败了.))

尽管来自Google Analytics,但任何类型的第三方跟踪器或自己的网络设置都运行良好.起初我下载了最后一个示例代码并查看了它们,当然你不能指望一个库已经支持最新的beta系统,不过,我试了一下.一旦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>
Run Code Online (Sandbox Code Playgroud)

还尝试了google-analytics.com并包含子域名NSIncludesSubdomains:true.而且,由于浏览器中的简单网站" https://google-analytics.com "重定向到" https://www.google.com/analytics/ ",我还尝试将google.com作为附加异常域,这也失败了.

即使看一下支持的ssl-ciphers,我认为这里没问题:

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
Run Code Online (Sandbox Code Playgroud)

因此,对于以下请求,Google Analytics分析跟踪仍然失败:https: //ssl.google-analytics.com/collect?[....]

有人提出解决方案或者在我的方法中发现某种错误吗?

Lep*_*ron 9

实际上上面的配置有点不对,我发现了一种工作方法.

- 短篇小说开始 -

基本上,上面的方法大多是正确的,但是当我查看Mac OS 10.10和OS 10.11建立的网络连接时,我再次检查配置.

openssl s_client -connect ssl.google-analytics.com:443 -status
Run Code Online (Sandbox Code Playgroud)

Mac OS 10.10使用TLSv1.2,而Mac OS 10.11因任何原因使用TLSv1.0

- 短篇小说结束 -

因此,在重新考虑属性后,我删除了证书透明度NSRequiresCertificateTransparency,因为默认值也设置为false而不是true.以下配置现在适用于我:

<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>
Run Code Online (Sandbox Code Playgroud)

附加说明:虽然谷歌使用这个"实验标准"(证书透明度):https://en.wikipedia.org/wiki/Certificate_Transparency 似乎在谷歌分析中没有使用它:-)