2011-10-17 12 views
9

Tôi nhận được một ứng dụng sử dụng ASIHTTPRequest.iOS 5: https (ASIHTTPRequest) ngừng hoạt động

tôi biên dịch lại ứng dụng của tôi với iOS 5 (sdk: 5.0/xcode: 4.2 Build 4D199) và https kết nối thất bại với thông báo lỗi (cuộc gọi cùng với https tác phẩm khuyết tật tốt):

Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred" UserInfo=0xa8e66e0 {NSUnderlyingError=0xa8ac6c0 "The operation couldn’t be completed. (OSStatus error -9844.)", NSLocalizedDescription=A connection failure occurred} 

Với debug log được kích hoạt:

[STATUS] Starting asynchronous request <ASIFormDataRequest: 0xd96fc00> 

[CONNECTION] Request <ASIFormDataRequest: 0xd96fc00> will not use a persistent connection 

[STATUS] Request <ASIFormDataRequest: 0xd96fc00>: Failed 

[CONNECTION] Request #(null) failed and will invalidate connection #(null) 

tôi thấy bài này có liên quan: https://devforums.apple.com/message/537440#537440 có thể Expl trong vấn đề của tôi.

dựa trên ý tưởng rằng iOS 5 thích TLS 1.2, tôi cố gắng thay đổi các thiết lập kCFStreamSocketSecurityLevelTLSv1 trong AIHTTPRequest.m

NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys: 
            [NSNumber numberWithBool:YES], 
kCFStreamSSLAllowsExpiredCertificates, 
            [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot, 
            [NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain, 
            kCFNull,kCFStreamSSLPeerName, 
             kCFStreamSocketSecurityLevelTLSv1, kCFStreamSSLLevel,// my modif 
            nil]; 

không thành công. Có lẽ sửa đổi của tôi không chính xác?

chi tiết:

  • tôi có ARC vô hiệu hóa
  • tôi sử dụng libz.1.2.5.dylib
  • tôi cập nhật các ASIHTTPRequest một tuần trước đây.

Tôi không biết vấn đề có phải là câu chuyện chứng chỉ (như phiên bản TLS) hay không.

bất kỳ trợ giúp/ý tưởng nào được hoan nghênh!

Trả lời

6

Dưới đây là giải pháp cuối cùng:

https://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309

 NSDictionary *sslProperties = [[NSDictionary alloc] initWithObjectsAndKeys: 
             [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates, 
             [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot, 
             [NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain, 
             kCFNull,kCFStreamSSLPeerName, 
             @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel, 
             nil]; 

Thêm param này:

         @"kCFStreamSocketSecurityLevelTLSv1_0SSLv3", kCFStreamSSLLevel, 
+1

Xem thêm bản vá này: https://github.com/ignaval/asi-http-request/commit/c782abbeb204156d30ecbb902915d1eaf9b10f9e#comments - bạn muốn thêm thuộc tính vào validateCertificate = YES case cũng – ckhan

+0

Đối với tôi, thay đổi của @ ckhan là cũng được yêu cầu trước khi nó hoạt động trên 5.0 – leontx

+0

lực 'kCFStreamSocketSecurityLevelTLSv1_2' cũng hoạt động với phương pháp này – ReDetection

1

Đây là những điều tôi sẽ cố gắng:

  1. Tải về một bản sao mới của asihttprequest, đặt nó vào một ứng dụng rất đơn giản mới được tạo ra mà chỉ làm cho đơn http và xem nếu nó cư xử như nhau
  2. Hãy thử so với các máy chủ https khác xem bạn có nhận được cùng một hành vi hay không (hãy thử với một số tên tuổi lớn, ví dụ: https://twitter.com - linkedin, google, v.v., tất cả đều có phiên bản https quá)
  3. Hãy thử cùng một máy chủ trong Safari (vẫn còn trên iOS) thiết bị)

Đối với những gì nó có giá trị, tôi có ASIHTTPRequest trên iOS5 làm việc tốt với máy chủ https của khách hàng của tôi - Tôi không phải thực hiện bất kỳ thay đổi nào cho iOS5.

+0

cảm ơn các mẹo. # 1: không thay đổi; # 2: trang web khác hoạt động tốt. ; # 3: với trình duyệt gốc, trang hiển thị như mong đợi. ; Bạn có thể vui lòng cho tôi biết với phiên bản TLS mà máy chủ của khách hàng của bạn sử dụng khi được gọi từ ứng dụng của bạn không? – Loda

+0

Tôi không thực sự chắc chắn; bạn có biết tôi sẽ kiểm tra như thế nào không? Từ các bằng chứng cho đến nay tôi có âm thanh như nó là cùng một vấn đề TLSv1.2 như liên kết bạn đăng lên diễn đàn của Apple - có lẽ bạn nên đăng mã của bạn ở đó và hy vọng Quinn có thể xem? – JosephH

+0

như tôi lo sợ, và như bạn đã đề xuất, nó có thể là một vấn đề liên quan đến máy chủ. Vì vậy, tôi không chắc chắn làm thế nào tôi có thể yêu cầu điều này trong một diễn đàn (NDA). Làm thế nào, nếu phiên bản TLS là vấn đề, tại sao không sửa đổi của tôi sửa chữa nó? ... Cảm ơn bạn đã giúp đỡ, tôi vui mừng khi biết nó không phải là một vấn đề chung với ASIHTTPRequest/iOS5. – Loda

1

Hãy thử sử dụng kCFStreamSocketSecurityLevelSSLv3 thay vì TLSv1. Điều đó làm việc cho tôi khi tôi gặp phải một tình huống tương tự.Tôi không chắc lý do tại sao việc tự động đàm phán không quay trở lại giao thức đúng, nhưng ít nhất trên một số máy chủ, nó dường như thất bại trong ASIHttpRequest, nơi nó sẽ làm việc với NSURLConnection.

6

Mở thiết lập của chúng tôi vấn đề đã được cố định bằng cách chèn

[sslProperties setObject:(NSString *)kCFStreamSocketSecurityLevelSSLv3 forKey:(NSString *)kCFStreamSSLLevel]; 

ngay trên

CFReadStreamSetProperty((CFReadStreamRef)[self readStream], kCFStreamPropertySSLSettings, sslProperties); 

trong Xử lý SSL phần Cài đặt chứng chỉ.

EDIT: Theo http://developer.apple.com/library/ios/#technotes/tn2287/_index.html#//apple_ref/doc/uid/DTS40011309 sau nên mạnh mẽ hơn

[sslProperties setObject:@"kCFStreamSocketSecurityLevelTLSv1_0SSLv3" forKey:(NSString *)kCFStreamSSLLevel]; 
+0

Cảm ơn giải pháp. Điều này đang làm việc cho ứng dụng iPhone của tôi nhưng khi tôi đặt cùng một dòng trong iPad ASIHTTPRequest của tôi nó không hoạt động. Điều gì có thể là giải pháp khả thi? Cảm ơn bạn. :) – Akshay

+0

Vì tôi đã trả lời câu hỏi này ASI đã ngừng duy trì ASIHTTPRequest và tôi đã bắt đầu sử dụng AFNetworking https://github.com/AFNetworking/AFNetworking. – weibel