2013-01-10 61 views
10

Nếu người dùng cố gắng tải trang web https trong Mobile Safari và kiểm tra xác thực chứng chỉ của máy chủ không thành công (đã hết hạn, bị thu hồi, tự ký, vv) thì người dùng được trình bày được hiển thị với thông báo cảnh báo và hỏi xem họ có muốn để tiếp tục hay không. Tương tự NSURLConnection cung cấp khả năng cho người triển khai quyết định trước hết cách kiểm tra chứng chỉ và sau đó quyết định cách tiến hành nếu nó không thành công, vì vậy trong tình huống này cũng có thể hiển thị cảnh báo cho người dùng và cung cấp cho họ cơ hội để tiếp tục tải trang hay không.Có ai đã tìm cách tải các trang HTTPS có chứng chỉ máy chủ không hợp lệ bằng UIWebView không?

Tuy nhiên có vẻ như khi tải trang https trong UIWebView thất bại chứng chỉ kiểm tra hành vi chỉ là không tải trang - didFailLoadWithError: được gọi với kCFURLErrorServerCertificateUntrusted tuy nhiên không có gì được hiển thị cho người dùng.

Điều này không phù hợp - chắc chắn hành vi UIWebView sẽ hoạt động theo cách tương tự như Safari để nhất quán trong chính iPhone? Nó cũng là một trục mà NSURLConnection cho phép tính linh hoạt hoàn toàn với điều này nhưng NSURLRequest: setAllowsAnyHTTPSCertificate là riêng tư.

Có cách nào để thực hiện hành vi phù hợp với Safari, hành vi mặc định này có thể được tùy chỉnh theo cách tương tự như NSURLConnection cho phép không?

Chúc mừng

P.S. Xin vui lòng không tham gia vào các cuộc thảo luận bên bảo trợ về lý do tại sao ai sẽ muốn làm điều này, cảm ơn bạn rất nhiều.

Trả lời

14

tôi phát hiện ra làm thế nào để làm điều này:

1) Khi trang web được tải, nó sẽ Thất bại, do đó thêm một cái gì đó như sau để didFailLoadWithError:

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
    if ([error.domain isEqualToString: NSURLErrorDomain]) 
    { 
     if (error.code == kCFURLErrorServerCertificateHasBadDate  || 
      error.code == kCFURLErrorServerCertificateUntrusted   || 
      error.code == kCFURLErrorServerCertificateHasUnknownRoot || 
      error.code == kCFURLErrorServerCertificateNotYetValid) 
     { 
     display dialog to user telling them what happened and if they want to proceed 

2) Nếu người dùng muốn tải trang thì bạn cần phải kết nối sử dụng một NSURLConnection:

NSURLRequest *requestObj = [NSURLRequest requestWithURL:self.currentURL  cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0]; 
self.loadingUnvalidatedHTTPSPage = YES; 
[self.webView loadRequest:requestObj]; 

3) Sau đó, thực hiện thay đổi này để shouldStartLoadWithRequest

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    if (self.loadingUnvalidatedHTTPSPage) 
    { 
     self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
     [self.connection start]; 
     return NO; 
    } 

4) Thực hiện các NSURLConnectionDelegate như:

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    SecTrustRef trust = challenge.protectionSpace.serverTrust; 
    NSURLCredential *cred; 
    cred = [NSURLCredential credentialForTrust:trust]; 
    [challenge.sender useCredential:cred forAuthenticationChallenge:challenge]; 
} 


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 
{ 
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:self.currentURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0]; 
    self.loadingUnvalidatedHTTPSPage = NO; 
    [self.webView loadRequest: requestObj]; 
    [self.connection cancel]; 
} 

Tất cả dường như hoạt động tốt.

+0

Đã khắc phục sự cố của tôi. Cảm ơn! –

1

Từ miệng của ngựa:..

"UIWebView không cung cấp bất kỳ cách nào cho một ứng dụng tùy chỉnh đánh giá tín nhiệm máy chủ HTTPS của nó Có thể làm việc xung quanh hạn chế này sử dụng các API công cộng, nhưng nó không phải là dễ dàng Nếu bạn cần phải làm điều này, xin vui lòng liên hệ với nhà phát triển Hỗ trợ kỹ thuật ([email protected])

Nguồn: http://developer.apple.com/library/ios/#technotes/tn2232/_index.html

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