iOS9 GoogleAnalytics 和 NSAppTransportSecurity

标签 ios swift ssl google-analytics 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>

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

您现在可以嗅探由第三方工具生成的应用流量,或者您可以使用记录所有网络流量的方式,引用此处: How can I figure out which URL is being blocked by 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>

还尝试了 google-analytics.com 并包含子域 NSIncludesSubdomains:true。而且,当浏览器中的简单网站调用“https://google-analytics.com”重定向到“https://www.google.com/analytics/”时,我还尝试允许 google.com 作为额外的异常(exception)域,但也失败了。

甚至查看了支持的 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

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

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

最佳答案

其实上面的配置有点错误,我找到了一个可行的方法。

-- 短篇小说开始--

基本上,上面的做法大部分是正确的,但是当我看到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,因为默认值也设置为 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>

补充说明:尽管谷歌使用了这个“实验标准”(证书透明度):https://en.wikipedia.org/wiki/Certificate_Transparency 它似乎没有在谷歌分析中使用它:-)

关于iOS9 GoogleAnalytics 和 NSAppTransportSecurity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31579507/

相关文章:

macos - viewWillDisappear 会被 Cmd+W 调用,但不会被 Cmd+Q 调用(对于 Swift 制作的 Mac 应用程序)

php - iOS 没有打开我的 https ://website SSL Certificates

https - Openssl TLS 扩展支持配置(服务器名称指示)

python - 将包添加到 PyPi 时发生 SSL 错误

ios - 仅生成 pdf : swift on 11. 3 的写入权限

ios - 从应用程序访问 iOS 文件系统的最佳方式是什么?

ios - swift CollectionView 单元格文本标签自动调整大小

javascript - 延迟加载图像在 iPhone 浏览器中不起作用

ios - swift 3 在 child 窗口上保留底部标签栏?

ios - 如何将 PHAsset 存储到 Core Data