2013-01-10 3 views
10

ユーザーがMobile Safariでhttps Webページをロードしようとしたときに、サーバーの証明書検証チェックが失敗した場合(期限切れ、失効、自己署名など)、ユーザーに警告メッセージが表示され、続行するかしないか。誰かが、UIWebViewを使用して無効なサーバー証明書でHTTPSページをロードする方法を見つけましたか?

同様にNSURLConnectionは、実装者が最初に証明書の確認方法を決定し、失敗した場合の処理​​方法を決定する機能を提供します。このような状況でも、ユーザーに警告を表示し、ページの読み込みを続行するかどうか。

しかし、証明書の確認に失敗したUIWebViewのhttpsページを読み込んでいるときに、ページをロードするのに失敗するようです - didFailLoadWithError:はkCFURLErrorServerCertificateUntrustedで呼び出されますが、何も表示されません。

これは矛盾しています - 確かに、UIWebViewの動作はSafariと同じようにiPhone自体の中で一貫して動作するはずですか? また、NSURLConnectionは、このNSURLRequestを使用して柔軟性を実現できます。setAllowsAnyHTTPSCertificateはプライベートです。

Safariと一貫性のある動作を実装する方法はありますか?NSURLConnectionと同様の方法でこのデフォルトの動作をカスタマイズできますか?

乾杯

P.S. なぜ誰かがこれをやりたいと思っているかについてのひっくり返ったサイドディスカッションへの参加を控えてください、どうもありがとうございます。馬の口から

答えて

14

私はこれを行う方法を見つけました失敗します、 これdidFailLoadWithErrorに次のようなものを追加します。

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

3)次にshouldStartLoadWithRequestにこの変更を行います。ユーザーは、ページをロードしたい場合

- (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)あなたはNSURLConnectionを使用して接続する必要があります

- (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)としてNSURLConnectionDelegateを実装:

- (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]; 
} 

すべて正常に動作しているようです。

+0

問題が解決しました。ありがとう! –

1

:。

「のUIWebView公開APIを使用してこの制限を回避することが可能であるそのHTTPSサーバの信頼性評価をカスタマイズするアプリのためにどのような方法を提供していませんが、それは容易ではない場合は。ページがロードされるとき、それはなります

1):あなたはこれを行う必要があり、開発者向け技術サポート([email protected])にお問い合わせください

出典:http://developer.apple.com/library/ios/#technotes/tn2232/_index.html

関連する問題