2016-06-18 2 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 인증서를 구현하여 우리의 역할을하고있는

, 그리고에 인증서 스위칭을 사용 :

아마도 사실 트위터는 기존 클라이언트를 지원하기 위해 노력하고있다가 함께 할 수있는 뭔가가 SHA-256 지원없이 이전 클라이언트를 감지 한 경우에만 SHA-1 인증서를 제공합니다.

https://blog.twitter.com/2015/sunsetting-sha-1에서 트위터가 혼동지고 보인다. 그래서 내 유일한 선택은 내 애플 리케이션에 대한 ALS 예외를 허용하는 것 같다.

자발적인 질문이 다른 사람에게 유용하기를 바랍니다.

+0

동일한 문제에 직면했지만 답변을 이해하지 못했습니다. 찾은 솔루션을 제공해 주시겠습니까? – Sam

+0

제가 이해 하듯이 기본적으로 'NSURLConnection'은 SHA-256 암호화를 전달하는 https URL을 필요로합니다. 트위터 이미지를 호스팅하는'pbs.twimg.com' 웹 서버는 SHA-256을 제공하고 가끔은 SHA-1을 제공하는 것으로 보인다. SHA-1을 제공하면 앱에서 내 질문에 오류를 표시합니다. 트위터 이미지 https URL을 직접 방문하고 몇 번 다시로드하면 가끔 SHA-1이 나오고, 때로 SHA-2가 나올 수도 있습니다. 왜 트위터가이 일을하는 지 모르겠지만, 내 연구에서 나는 SHA-1을 노려 보는 것에 관한 블로그 게시물을 발견했다. 그게 도움이 되니? –

관련 문제