3

NSURLSession を使用して、iOS 8 以降のアプリで公開鍵の固定を行う方法を実装しようとしています。

私がすることは、デリゲート メソッド didReceiveChallenge を実装し、challenge.protectionSpace.authenticationMethod を取得して、それが NSURLAuthenticationMethodServerTrust と等しいかどうかを確認するだけです。

それが NSURLAuthenticationMethodServerTrust と等しい場合、証明書をチェックしてローカル コピーと比較します。

これは iOS 8 では問題なく動作しますが、iOS 9 では NSURLAuthenticationMethodServerTrust と同等の認証方法を受け取りません。NSURLAuthenticationMethodClientCertificate を受け取るため、challenge.protectionSpace.serverTrust プロパティにアクセスできません。

何か案は?

public func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential!) -> Void)
{


      if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust)
        {
            // Verify the identity of the server
                    println("Trusted")
                    return challenge.sender.performDefaultHandlingForAuthenticationChallenge!(challenge)

        }
        println("Not trusted")
        return challenge.sender.cancelAuthenticationChallenge(challenge)
    }
}
4

1 に答える 1

3

コールバックは、さまざまな保護スペースに対して複数回呼び出すことができます。ここで何が起こっているかというと、これらの呼び出しの順序が変更されており、iOS 9 では何らかの理由でサーバー信頼保護スペースの呼び出しが最初に行われていないようです。

問題は、最初のチャレンジをキャンセルしていることです。これにより、接続が効果的に終了します。そうしないでください。代わりに、「デフォルトの処理を実行する」を使用してください。

また、サーバーのトラスト ケースに対してデフォルトの処理を実行したくない場合もあります。これは、カスタム ハンドラーをまったく作成しないことと同じであるためです。代わりに、キーを確認し、それが必要なキーである場合にのみデフォルトの処理を実行し、そうでない場合は認証チャレンジをキャンセルします。

または、コードを読み間違えている可能性があります。いくつかのコードが欠落しているようです。サーバー信頼以外のケースをまったく処理していない可能性があります。その場合、それが問題です。すべての課題に対して何かを呼び出さないと、接続は永遠にそこに留まり、あなたがそうするのを待っています。

于 2015-12-03T20:25:17.350 に答える