2016-07-25 3 views
0

私は、HTTPSを使用してサービスに接続するテストアプリケーションに取り組んでいます。この接続の証明書はカスタムルート証明書を使用しています。だから私は `NSURLSessionDelegate」のデリゲートを実装し、このようにそれを実装:`SFCertificateTrustPanel`を迅速に使うにはどうしたらいいですか?

func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { 
    if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { 
     let trust: SecTrustRef = challenge.protectionSpace.serverTrust! 
     var secresult: SecTrustResultType = SecTrustResultType(kSecTrustResultInvalid) 
     if SecTrustEvaluate(trust, &secresult) == errSecSuccess { 
      switch (Int(secresult)) { 
      case kSecTrustResultUnspecified: 
       break 
      case kSecTrustResultProceed: 
       let credential = NSURLCredential(forTrust: trust) 
       completionHandler(.UseCredential, credential) 
       return 
      default: 
       print("default") 
      } 
     } 
    } 
    completionHandler(.CancelAuthenticationChallenge, nil) 
} 

私はケースkSecTrustResultProceedに入るが、ここに示したコードは無限ループになります。私はいつもこのエラーに遭遇:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) 

私は証明書がユーザーによって信頼されていないので、それがある疑いがあるので、私はおよそSFCertificateTrustPanelユーザーが証明書の信頼を受け入れることができる場所をお読みください。しかし、この方法はSwiftから入手できないようです。

SFCertificateTrustPanelを迅速に使用するにはどうすればよいですか?

証明書を信頼できる方法がありますか?指紋に基づいて?私はあなたがスウィフトからSFCertificateTrustPanelを使用することができませんでした何らかの理由が分からない

答えて

1

、あなたはそうは言ってもOS X上だと仮定すると、それは内部からあなたが行うことができないことをあまりしませんアプリ。

必要な作業は、特定のTLS証明書を許可するように保護スペースを変更することです。 Appleの記事「Overriding TLS Chain Validation Correctly」を読むことをお勧めします。 TLS証明書をNSDataオブジェクトにロードし、SecCertificateRefに変換してSecTrustRefオブジェクトに追加する必要があります。これらのステップのほとんど(ただしすべてではありません)は、上記のリンクされたドキュメントでカバーされています。

異なるサーバーで異なる証明書を使用する場合は、新しい証明書が表示されたときに接続が失敗するようにしてから、ユーザーに証明書を信頼するかどうかを尋ねるダイアログを表示します指紋を与えるなど)。ユーザーが「はい」と答えた場合は、その証明書をNSDataオブジェクト(DERフォームなど)にエクスポートして、NSUserDefaultsなどの信頼できる証明書の配列に格納し、その証明書配列のすべての項目をカスタムの信頼オブジェクトに追加します信頼評価関数。

最後に、さまざまなTLSライブラリのiOSバージョンには、ディスク、IIRC上のファイルからキーと証明書を読みやすく、NSData表現と実際の証明書またはRSAキー。これらのメソッドは、iOSシミュレータが機能するために必要なので、ドキュメントに記載されているものの、OS Xで利用できます。 :-)

+0

Swiftプロジェクトに 'SFCertificateTrustPanel'を使用するために正確に含める必要があるものは何ですか?私が持っている問題は、このパネルを使用するために含める適切なライブラリ/ヘッダーが見つからないということです。 – Flovdis

+0

これはSecurityInterfaceフレームワークにありますので、SecurityInterface/SecurityInterface.hをインポートするとか、Swiftと同等のものをインポートしていると思いますが...私はSwiftプログラマーではないので、確実に言えません。アップルはそれのためにSwiftヘッダーを構築することは決してなかった可能性があります。その場合、それらを作成する必要があります。 – dgatwood

+0

この場合、あなたの答えは私の質問に全く答えません。私は証明書を検証する方法を知っています。私が求めているのは、 'SFCertificateTrustPanel'を使ってユーザに証明された証明書を信頼するように頼む方法です。 – Flovdis

関連する問題