在iOS 8中下载时出现kCFStreamErrorDomainSSL错误

时间:2015-11-11 13:31:14

标签: ios swift nsurlsession

我正在尝试使用Swift.But中的NSURLSessionDownloadDelegate下载文件。当我调用下载方法时,它经常显示以下错误。

  

错误Domain = NSURLErrorDomain Code = -1202“操作无法完成。(NSURLErrorDomain错误-1202。)”UserInfo = 0x7fbac2dd2f60 {NSErrorFailingURLStringKey = https://dl.dropboxusercontent.com/content_link/EvFVp1WYxrW15Vy6kfUGIChdHy4HVhatT0p6iQhhG24wzNsQ48CEDs0shjmTbCWb/file?dl=1,NSErrorFailingURLKey = https://dl.dropboxusercontent.com/content_link/EvFVp1WYxrW15Vy6kfUGIChdHy4HVhatT0p6iQhhG24wzNsQ48CEDs0shjmTbCWb/file?dl=1,NSURLErrorFailingURLPeerTrustErrorKey = ,_kCFStreamErrorDomainKey = 3,_kCFStreamErrorCodeKey = -9813,NSUnderlyingError = 0x7fbac2ca07e0“操作无法完成。(kCFErrorDomainCFNetwork error -1202。)”}

我尝试编辑info.plist但它无效。

1 个答案:

答案 0 :(得分:0)

您是否为ATS(Apple Transport Security)添加了任意加载,例如:

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

请注意,这是不安全的,您可能希望按域自定义ATS规则,如:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>dl.dropboxusercontent.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
        </dict>
    </dict>

[UPDATE] 如果我们更好地看错误,我们可以看到关键

<强> NSURLErrorFailingURLPeerTrustErrorKey

然后Apple关于HTTPS Server Trust Evaluation的技术说明可能有所帮助。 继续我们阅读的文档

  

Domain = NSURLErrorDomain Code = -1202&#34;此服务器的证书是   无效。您可能正在连接到假装的服务器   “example.com”可能会使您的机密信息面临风险。&#34;   UserInfo = 0x14a730 {NSErrorFailingURLStringKey = https://example.com/,   NSLocalizedRecoverySuggestion =您想要连接到服务器吗?   无论如何?,NSErrorFailingURLKey = https://example.com/,   NSLocalizedDescription =此服务器的证书无效。您   可能连接到假装是“example.com”的服务器   这可能会使您的机密信息面临风险。,   NSUnderlyingError = 0x14a6c0&#34;此服务器的证书是   无效。您可能正在连接到假装的服务器   “example.com”可能会使您的机密信息面临风险。&#34;,   NSURLErrorFailingURLPeerTrustErrorKey =}

嗯,那个很漂亮,因为NSURLErrorDomain域中的 -1202 错误是 NSURLErrorServerCertificateUntrusted ,因为TSL存在可能的问题。

所以我们需要检查TSL:

我们通过CLI检查证书:

$ openssl s_client -showcerts -host dl.dropboxusercontent.com -port 443
CONNECTED(00000003)
depth=2 /C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/OU=Domain Control Validated/CN=dl.dropboxusercontent.com
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
---
Server certificate
subject=/OU=Domain Control Validated/CN=dl.dropboxusercontent.com
issuer=/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certs.godaddy.com/repository//CN=Go Daddy Secure Certificate Authority - G2
---
No client certificate CA names sent
---
SSL handshake has read 4569 bytes and written 456 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 50414926328455F36215516BEB0C40F1DD512C3C0989E0C090DC9277E754B35EFF0CE3AEA4D3FB524FFE071BE2D4426C
    Key-Arg   : None
    Start Time: 1447281208
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
closed

我们可以看到此域名支持 TLSv1 / SSLv3,

我们可以使用SSL质量实验室的SSL服务器测试在线进行此操作,并获得相同的良好结果here

我不知道这个问题是否与A couple users getting NSURLErrorServerCertificateUntrusted重复 但是通过上面的TSL检查我们可以清楚地看到有问题的域名是正确的。

所以(简单)问题

您的手机时间和日期是否正确?