2012-02-16 26 views
5

Tôi cố gắng để thực hiện SSL xác nhận giấy chứng nhận và đã thực hiện các đại biểu canAuthenticateAgainstProtectionSpacephương pháp iOS canAuthenticateAgainstProtectionSpace không được gọi mỗi khi

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace: (NSURLProtectionSpace*)protectionSpace 
{ 
    OSStatus status = SecTrustEvaluate(protectionSpace.serverTrust, &trustResult); 
    if(status == errSecSuccess) 
    { 
    } 
    else 
    { 
    } 
} 

Tuy nhiên, tôi nhận thấy rằng đại biểu này được gọi lần đầu tiên cho một URL nào đó, nhưng không phải cho các lần thử tiếp theo cho cùng một URL. Tôi nghĩ điều này phải làm với phản hồi được lưu trong bộ nhớ cache, vì vậy tôi đã tạo NSURLRequest như sau:

NSURLRequest *request = [[NSURLRequest alloc] 
         initWithURL: [NSURL URLWithString:_urlString] 
         cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData 
         timeoutInterval: 10 
         ]; 

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

Điều này cũng không hữu ích. Bất kỳ ý tưởng, làm thế nào tôi có thể nhận được phương pháp canAuthenticateAgainstProtectionSpace để có được gọi là mỗi lần?

Trả lời

2

tôi giải quyết vấn đề bằng cách thêm đoạn mã sau:

- (void)connection:(NSURLConnection *)connection 
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
[[challenge sender] cancelAuthenticationChallenge:challenge]; 
} 

Trên hủy thách thức xác thực và do đó canAuthenticateAgainstProtectionSpace đại biểu được gọi mỗi khi

10

Câu trả lời ở trên không giải quyết vấn đề thực tế . Vấn đề thực tế ở đây là một thách thức xác thực chỉ được trình bày lần đầu tiên một kết nối được thiết lập cho URL đó trong khi ứng dụng đang mở.

Như đã giải thích here

Một TLS phiên là bộ xử lý chuyên sâu và Apple không muốn bạn để tạo một hình mới mỗi khi một kết nối được thực hiện để URL đó, để chúng lưu trữ một cho bạn. Trong trường hợp này, nó hoạt động chống lại bạn, nhưng bạn sẽ có thể giải quyết vấn đề bằng cách bao gồm "." ký tự ở cuối máy chủ của bạn.

Trong trường hợp của chúng tôi, chúng tôi đã cố gắng thiết lập kết nối với máy chủ web có chứa chứng chỉ được cấp bởi CA nội bộ. Vì chúng tôi biết CA sẽ không được tin cậy vào kết nối đầu tiên, chúng tôi cho phép kết nối tiếp tục để có thể tải xuống CA. Trong kết nối đó, chúng ta thêm "." ký tự đến cuối máy chủ. Tất cả các kết nối tiếp theo sử dụng URL thông thường mà không có dấu "." ký tự ở cuối máy chủ. Điều này đảm bảo rằng chứng chỉ CA mà chúng tôi đã tải xuống được xác thực lần đầu tiên khi kết nối "thực" được thực hiện.

+0

Insane, gợi ý hữu ích như vậy! Cảm ơn bạn rất nhiều vì chia sẻ điều này ! :-) – Lepidopteron

Các vấn đề liên quan