【问题标题】:Intermittent HTTP load failed kCFStreamErrorDomainSSL (-9802)间歇性 HTTP 加载失败 kCFStreamErrorDomainSSL (-9802)
【发布时间】:2016-10-20 08:42:34
【问题描述】:

我在尝试从 twitter 加载图像文件时间歇性发生此错误,其 URL 如下:https://pbs.twimg.com/media/Ck-9Oc6XIAAIb8B.jpg

针对 ios8 并在两个 ios9 设备和模拟器上失败,间歇性地,通常至少有 20% 的时间。

我有一个带有重新加载按钮的测试应用程序,允许重试。如果第一次有效,则每次后续重新加载似乎都有效(也许是缓存?)。如果第一次失败,最终会在重试几次(比如 5-10 次)后成功加载。

Twitter 肯定有适当的 SSL 设置。怎么回事?

理想情况下,我不想完全禁用 ALS,甚至只是为了这个域。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var myImageView: UIImageView!

    @IBAction func didPressReload(sender: AnyObject) {

        loadImage()
    }

    func loadImage() {
        myImageView.imageFromUrl("https://pbs.twimg.com/media/Ck-9Oc6XIAAIb8B.jpg")
    }
}

extension UIImageView {
    public func imageFromUrl(urlString: String) {
        if let url = NSURL(string: urlString) {
            let request = NSURLRequest(URL: url)
            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {

                (response: NSURLResponse?, data: NSData?, error: NSError?) in

                if (error != nil) {
                    NSLog("Failed to load URL \(response?.URL?.absoluteString): \(error)")

                }

                if let imageData = data as NSData? {
                    self.image = UIImage(data: imageData)
                }
            }
        }
    }
}

失败时的错误详情:

2016-06-18 18:17:19.975 TestSSL[1027:420188] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
2016-06-18 18:17:20.011 TestSSL[1027:420137] Failed to load URL nil: Optional(Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, NSUnderlyingError=0x14597da0 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamPropertySSLClientCertificateState=0, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x146977b0>, _kCFStreamErrorDomainKey=3, kCFStreamPropertySSLPeerCertificates=<CFArray 0x14595f90 [0x3b0ca840]>{type = immutable, count = 4, values = (
    0 : <cert(0x14696590) s: *.twimg.com i: DigiCert High Assurance CA-3>
    1 : <cert(0x14696a90) s: DigiCert High Assurance CA-3 i: DigiCert High Assurance EV Root CA>
    2 : <cert(0x14696eb0) s: DigiCert High Assurance EV Root CA i: Baltimore CyberTrust Root>
    3 : <cert(0x146971e0) s: Baltimore CyberTrust Root i: Baltimore CyberTrust Root>
)}, NSErrorFailingURLStringKey=https://pbs.twimg.com/media/Ck-9Oc6XIAAIb8B.jpg, NSErrorFailingURLKey=https://pbs.twimg.com/media/Ck-9Oc6XIAAIb8B.jpg}}, _kCFStreamErrorCodeKey=-9802, NSErrorFailingURLStringKey=https://pbs.twimg.com/media/Ck-9Oc6XIAAIb8B.jpg, NSErrorPeerCertificateChainKey=<CFArray 0x14595f90 [0x3b0ca840]>{type = immutable, count = 4, values = (
    0 : <cert(0x14696590) s: *.twimg.com i: DigiCert High Assurance CA-3>
    1 : <cert(0x14696a90) s: DigiCert High Assurance CA-3 i: DigiCert High Assurance EV Root CA>
    2 : <cert(0x14696eb0) s: DigiCert High Assurance EV Root CA i: Baltimore CyberTrust Root>
    3 : <cert(0x146971e0) s: Baltimore CyberTrust Root i: Baltimore CyberTrust Root>
)}, NSErrorClientCertificateStateKey=0, NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x146977b0>, NSErrorFailingURLKey=https://pbs.twimg.com/media/Ck-9Oc6XIAAIb8B.jpg})

【问题讨论】:

  • 您找到解决方案了吗? “我不想禁用 ALS”是什么意思?

标签: swift ssl ios8 ios9


【解决方案1】:

我的错误是假设“Twitter 肯定有适当的 SSL 设置”。我通过在 Chrome 中反复重新加载发现,有时只提供了一个 SHA-1 证书。

也许 twitter 试图支持旧版客户端的事实与此有关:

我们正在尽自己的一份力量在我们的 Twitter 端点,并使用证书切换仅服务 SHA-1 如果我们检测到不支持 SHA-256 的旧客户端,则证书。

来自https://blog.twitter.com/2015/sunsetting-sha-1

似乎 twitter 有时会变得混乱。所以我唯一的选择似乎是允许我的应用使用 ALS 例外。

我希望我自己回答的问题对其他人有用。

【讨论】:

  • 面临同样的问题,但不明白你的答案..你能提供你找到的解决方案吗?
  • 据我了解,NSURLConnection 现在默认需要提供 SHA-256 加密的 https URL。似乎pbs.twimg.com Web 服务器(托管 Twitter 图像)有时服务于 SHA-256,有时服务于 SHA-1。当它提供 SHA-1 时,该应用程序会给出我的问题中显示的错误。我也在 Chrome 上发现了这个,如果你直接访问 Twitter 图片 https URL,然后重新加载几次,有时你会得到 SHA-1,有时你会得到 SHA-2。我不知道 Twitter 为什么会这样做,但在我的研究中,我发现我链接的那篇博客文章是关于取消 SHA-1 的。这有帮助吗?
猜你喜欢
  • 2015-09-04
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 2015-12-29
  • 2016-01-18
  • 1970-01-01
相关资源
最近更新 更多