2016-09-19 224 views
4

NSURLProtocolでNSURLSessionを使用してトラフィックを捕捉し、UIWebViewのプロキシ経由でチャネリングします。無効な証明書を持っている私は、ブラウザのHTTPSサイトは、その後のUIWebViewをして失敗した場合:NSURLSessionの信頼できない証明書エラーがiOS 10のカスタムプロトコルで機能しない

Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “revoked.grc.com” which could put your confidential information at risk." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSErrorFailingURLKey=, NSErrorFailingURLStringKey=, NSErrorPeerCertificateChainKey=( "", "" ), NSErrorClientCertificateStateKey=0, NSLocalizedDescription=The certificate for this server is invalid. You might be connecting to a server that is pretending to be “revoked.grc.com” which could put your confidential information at risk., _kCFStreamErrorDomainKey=3, NSUnderlyingError=0x170255420 {Error Domain=kCFErrorDomainCFNetwork Code=-1202 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=, _kCFNetworkCFStreamSSLErrorOriginalValue=-9807, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9807, kCFStreamPropertySSLPeerCertificates=( "", "" )}}, _kCFStreamErrorCodeKey=-9807}

のiOS 9で、下が、iOSの10で、それは次のエラー与える:私はiOSの10中のSO

Error Domain=kCFErrorDomainCFNetwork Code=310 "There was a problem communicating with the secure web proxy server (HTTPS)." UserInfo={NSErrorFailingURLStringKey=, NSErrorFailingURLKey=, _kCFStreamErrorCodeKey=-2096, _kCFStreamErrorDomainKey=4, NSLocalizedRecoverySuggestion=Please check your proxy settings. For help with this problem, contact your system administrator., NSLocalizedDescription=There was a problem communicating with the secure web proxy server (HTTPS).}

をプロキシを通過している信頼されていないサイトの方法を把握することはできません。 NSURLProtocol(NSURLSession)にプロキシのない無効な証明書を持つサイトがある場合は、iOS 10でも正常に動作します。

didReceiveChallengeデリゲートメソッドの実装。

AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate; if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){ SecTrustRef trust = [[challenge protectionSpace] serverTrust]; SecCertificateRef cert = SecTrustGetCertificateAtIndex(trust, 0); if ([[appDelegate certStore] containsCertificate:cert]) { completionHandler(NSURLSessionAuthChallengeUseCredential,[NSURLCredential credentialForTrust:trust]); return; } } completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);

答えて

0

私は、ファイルに証明書をコピーし、openssl s_clientを使用して、そのホストに接続し、その上でopenssl x509 -in cert.crt -text -nooutを実行する場合、私はこれを参照してください。SHA-1証明書の

Signature Algorithm: sha1WithRSAEncryption 

サポートが廃止されましたiOS 10では、App Transport Securityの例外が必要です。

  • あなたは一時的にアプリを再度実行して取得するためにATS例外を追加する必要があります

    これは二つのことを意味します。

  • は、その証明書を、SHA-1署名をできるだけ早く使用する証明書で置き換える必要があります。

この2番目のステップは非常に重要です。 2016年以降ののことを理解しているので、SHA-1のATS例外を含む新しいバージョンのアプリを提出することはできません。

+0

私はplistでATSをtrueに設定しました。 NSAppTransportSecurity \t \t \t NSAllowsArbitraryLoads \t \t \t user1878752

+0

そして、それはその変化に取り組んでいますか? – dgatwood

+0

同じことはまだありません、私のプロジェクトにはATS真がすでにあります。 – user1878752

2

根本的な要求はプロキシ経由で証明書を取得するためにHTTPリクエストを発行する固定されていないです意味iOS版10上のプロキシを経由して証明書にアクセスする場合は、エラーコード310を取得します。これは、iOSが中間証明書を取得または更新する必要がある場合に発生します。スタンドアロンプ​​ロセスsecuritydが要求を発行します。あなたがで証明書要求をプロキシなしで行く作るべき

  • 時間的にプロキシ
  • をオフにするか、すべての要求をマークプロキシ

を使用していない.crtで終わる次に、あなたが取得する必要があります正しい証明書とコードが引き続き実行されます。

関連する問題