2015-08-25 19 views
14

Trong iOS 9, tôi đang yêu cầu url https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg bằng cách sử dụng NSURLConnection cơ bản.Lỗi tải xuống NSURLSession/NSURLConnection HTTP không thành công (kCFStreamErrorDomainSSL, -9802) trong kết nối https

NSOperationQueue *completionQueue = [NSOperationQueue mainQueue]; 
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    self.mURLSession = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:completionQueue]; 

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg"]]; 
    NSURLSessionDataTask *dataTask = [self.mURLSession dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     NSLog(@"%@",error); 
    }]; 
    [dataTask resume]; 

Nhưng nhận được lỗi này

Lỗi miền = NSURLErrorDomain Mã = -1200 "Một lỗi SSL đã xảy ra và một kết nối an toàn với máy chủ không thể được thực hiện." UserInfo = {NSLocalizedDescription = Lỗi SSL đã xảy ra và không thể thực hiện kết nối an toàn tới máy chủ. NSLocalizedRecoverySuggestion = Bạn có muốn kết nối với máy chủ không ?, _kCFStreamErrorDomainKey = 3, NSUnderlyingError = 0x7c1075e0 {Tên miền lỗi = kCFErrorDomainCFNetwork Code = - 1200 "(null)" UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0, _kCFNetworkCFStreamSSLErrorOriginalValue = -9802, _kCFStreamErrorCodeKey = -9802, _kCFStreamErrorDomainKey = 3, kCFStreamPropertySSLPeerTrust =, kCFStreamPropertySSLPeerCertificates = {type = bất biến, count = 3, các giá trị = ( 0: 1: 2: )}}}, _kCFStreamErrorCodeKey = -9802, NSErrorFailingURLStringKey = https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg, NSErrorPeerCertificateChainKey = {type = bất biến, count = 3, các giá trị = ( 0: 1: 2: )}, NSErrorClientCertificateStateKey = 0, NSURLErrorFailingURLPeerTrustErrorKey =, = NSErrorFailingURLKey https://s3.amazonaws.com/furniture.retailcatalog.us/products/2061/6262u9665.jpg}

Mặc dù đây là https kết nối, tại sao tôi lại nhận được lỗi lạ này. Bất cứ ai có thể vui lòng cho tôi biết.

+0

Tôi không quá hiểu biết có thể tìm hiểu về vấn đề này, nhưng tôi tin rằng chỉ có HTTPS là không đủ trên iOS 9 - kết nối của bạn cũng cần phải sử dụng ít nhất TLS 1.2.Bạn có thể google xung quanh và tìm thấy một dịch vụ sẽ cho bạn biết nếu bạn có điều đó trên cho máy chủ này. Đó là lý do cho lỗi này khi tôi nhìn thấy nó một lúc trước. –

Trả lời

27

Theo Apple tech note, Bảo mật truyền tải ứng dụng yêu cầu SHA-2. Các chứng chỉ S3 (và CloudFront) đang sử dụng SHA-1, đó là lý do tại sao lỗi này xảy ra.

Cách giải quyết là đặt NSExceptionRequiresForwardSecrecy thành false. (Cho đến khi AWS chuyển sang SHA-2 (by September 30th, 2015)).

SHA-1 Signature

+0

vẫn không thực hiện bất kỳ đề xuất nào khác? –

+0

gặp phải lỗi này: Bảo mật chuyển tải ứng dụng đã chặn tải tài nguyên HTTP (http: //) rõ ràng vì nó không an toàn. Các ngoại lệ tạm thời có thể được định cấu hình thông qua tệp Info.plist của ứng dụng của bạn. –

+0

Thêm miền ngoại lệ trong "Cài đặt bảo mật giao thông ứng dụng" trong "info.plist". –

6

Tôi cũng gặp phải điều này với Amazon S3. Thật không may, tôi không thể cho bạn biết lý do tại sao này đang xảy ra - S3 xuất hiện để đáp ứng các yêu cầu giữ bí mật về phía trước (at least according to this answer):

 
Adams-MacBook-Pro:tmp Adam$ curl -kvI https://s3.amazonaws.com 
* Rebuilt URL to: https://s3.amazonaws.com/ 
* Trying 54.231.32.128... 
* Connected to s3.amazonaws.com (54.231.32.128) port 443 (#0) 
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 

Cách giải quyết, which I found here là thêm một ngoại lệ cho tập tin Info.plist của ứng dụng của bạn để không yêu cầu bảo mật chuyển tiếp:

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSExceptionDomains</key> 
    <dict> 
     <key>s3.amazonaws.com</key> 
     <dict> 
      <key>NSExceptionRequiresForwardSecrecy</key> 
      <false/> 
     </dict> 
    </dict> 
</dict> 

Theo như tôi có thể nói, đây là số tiền tối thiểu bạn có thể giảm bảo mật tích hợp để kết nối với Amazon S3.

2

Với sự giúp đỡ từ các câu trả lời khác được cung cấp ở đây, và here, tôi cố định ứng dụng của tôi mà cần phải kết nối với nhiều tên miền phụ cloudfront.net với bổ sung này cho plist:

 <key>NSAppTransportSecurity</key> 
     <dict> 
      <key>NSExceptionDomains</key> 
      <dict> 
       <key>cloudfront.net</key> 
        <dict> 
        <!--Include to allow subdomains--> 
        <key>NSIncludesSubdomains</key> 
        <true/> 
        <key>NSExceptionRequiresForwardSecrecy</key> 
        <false/> 
       </dict> 
      </dict> 
     </dict> 
0

Đối với tôi giải pháp là thêm ngoại lệ này cho miền:

<dict> 
    <key>NSExceptionDomains</key> 
    <dict> 
     <key>xxx.com</key> 
     <dict> 
      <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> 
      <true/> 
     </dict> 
    </dict> 
</dict> 
Các vấn đề liên quan