2016-06-18 5 views
1

У меня прерывистое возникновение этой ошибки при попытке загрузить файлы изображений из твиттера, с URL-адресом, такими как это: https://pbs.twimg.com/media/Ck-9Oc6XIAAIb8B.jpgперемежающейся нагрузка HTTP не удалась kCFStreamErrorDomainSSL (-9802)

Ориентации ios8 и не на два ios9 устройств и симуляторе , с перерывами, обычно не менее 20% времени.

У меня есть тестовое приложение с кнопкой перезагрузки, которая позволяет повторить попытку. Если в первый раз работает, каждая последующая перезагрузка, похоже, работает (возможно, кэширование?). Если первый раз не удается, он будет успешно загружен после повторной попытки несколько раз (скажем, 5-10).

Уверенный твиттер имеет соответствующую настройку 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}) 
+0

Вы нашли решение? Что вы подразумеваете под «Я не хочу отключать ALS»? – Sam

ответ

1

Моя ошибка была в предположении "конечно, твиттер имеет соответствующую настройку SSL". Я нашел многократную перезагрузку в Chrome, что иногда предоставляется только сертификат SHA-1.

Возможно, тот факт, твиттер пытается поддерживать устаревшие клиенты что-то делать с ним:

Мы делаем свою часть за счет реализации SHA-256 сертификатов на наших Twitter конечных точек, а также с помощью Cert переключение на только обслуживают сертификаты SHA-1 , если мы обнаруживаем старых клиентов без поддержки SHA-256.

из https://blog.twitter.com/2015/sunsetting-sha-1

Казалось бы щебет иногда путаться. Таким образом, мой единственный выбор, по-видимому, заключается в разрешении исключений ALS для моего приложения.

Надеюсь, мой вопрос, ответивший на вопрос, полезен для кого-то другого.

+0

Одиночная проблема, но не поняла ваш ответ. Не могли бы вы предоставить решение, которое вы нашли? – Sam

+0

Как я понимаю, 'NSURLConnection' по умолчанию теперь требует URL-адресов https, которые обеспечивают шифрование SHA-256. Кажется, что на веб-сервере 'pbs.twimg.com' (который размещает изображения Twitter) SOMETIMES обслуживает SHA-256, а SOMETIMES обслуживает SHA-1. Когда он обслуживает SHA-1, приложение показывает ошибку, указанную в моем вопросе. Я тоже нашел это в Chrome, если вы сразу посещаете URL-адрес https изображения twitter и перезагружаетесь несколько раз, иногда вы получаете SHA-1, иногда вы получаете SHA-2. Я не знаю, почему Twitter сделал это, но в своих исследованиях я обнаружил, что сообщение в блоге, которое я связывал о закате SHA-1. Это помогает? –

 Смежные вопросы

  • Нет связанных вопросов^_^