web-dev-qa-db-ja.com

Alamofireを使用して(無効な証明書で)ローカルホストに接続する方法は?

これはSwiftを使用した私の最初のプロジェクトです。私はAPIを接続するためにalamofireを使用しています。デバッグに使用したいAPIからローカルコピーを持っているので、テストデータを設定できます。これは、リモートAPIに、いじることができない実際のデータがすでに含まれているためです。

問題は、https://localhost:8443/MyProjectにアクセスしようとすると、以下のエラーが発生することです。

オプション(エラードメイン= NSURLErrorDomainコード= -1202 "このサーバーの証明書は無効です。機密情報を危険にさらす可能性のある「localhost」のふりをしているサーバーに接続している可能性があります。" UserInfo = 0x7fbeb8c61ff0 {NSURLErrorFailingURLPeerTrustErrorKey = 、NSLocalizedRecoverySuggestion =とにかくサーバーに接続しますか?、_ kCFStreamErrorCodeKey = -9813、NSUnderlyingError = 0x7fbeb8ea5c00 "操作を完了できませんでした。(kCFErrorDomainCFNetworkエラー-1202。)"、NSLocalizedDescription =このサーバーの証明書が無効です。機密情報を危険にさらす可能性のある「localhost」のふりをしているサーバーに接続している可能性があります。、NSErrorFailingURLKey = https:// localhost:8443/myproject/api/loginUser.pdo 、 NSErrorFailingURLStringKey = https:// localhost:8443/myproject/api/loginUser.pdo 、_ kCFStreamErrorDomainKey = 3})

setAllowsAnyHTTPSCertificateを使用するか、Connectionのデリゲートを使用するなど、Objective-cの多くの解決策を見つけました。しかし、SwiftでsetAllowsAnyHTTPSCertificateの適切なメソッドを見つけることができず、alamofireの使用中にデリゲートを接続に設定する方法がわかりません。私がする必要があるアイデアはありますか?

  • setAllowsAnyHTTPSCertificateはプライベートAPIであり、プロジェクトがAppleによって拒否されることを知っています。デバッグ中にのみ使用したいので、プロジェクトを公開する前に削除されます。

前もって感謝します。

15
Ismail

SessionDelegateオーバーライドクロージャを使用して、Alamofireのデフォルトのチャレンジ動作を簡単にオーバーライドできます。 Alamofireに無効な証明書の受け入れを許可する方法の例を次に示します。

重要:これを本番コードで使用しないでください。セキュリティは非常に重要であり、この実装はAlamofireのセキュリティメカニズムを完全に無視します。自己責任!

let manager = Alamofire.Manager.sharedInstance

manager.delegate.sessionDidReceiveChallenge = { session, challenge in
    var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling
    var credential: NSURLCredential?

    if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
        disposition = NSURLSessionAuthChallengeDisposition.UseCredential
        credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust)
    } else {
        if challenge.previousFailureCount > 0 {
            disposition = .CancelAuthenticationChallenge
        } else {
            credential = manager.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace)

            if credential != nil {
                disposition = .UseCredential
            }
        }
    }

    return (disposition, credential)
}

私たち( Alamofire TC )は、 Alamofire 1.3. リリースでTLSピン留めとセキュリティに関連する他のいくつかの機能を実装する予定です。


更新

Alamofire 1.3.0リリースがリリースされ、サーバーの信頼認証の課題をカスタマイズするためのサポートが大幅に強化されました。詳細については、READMEの Security セクションを確認してください。

20
cnoon

@cnoonのコードのSwift3バージョン

    manager.delegate.sessionDidReceiveChallenge = { session, challenge in
        var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling
        var credential: URLCredential?

        if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust, let trust = challenge.protectionSpace.serverTrust {
            disposition = URLSession.AuthChallengeDisposition.useCredential
            credential = URLCredential(trust: trust)
        } else {
            if challenge.previousFailureCount > 0 {
                disposition = .cancelAuthenticationChallenge
            } else {
                credential = self.manager.session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace)

                if credential != nil {
                    disposition = .useCredential
                }
            }
        }

        return (disposition, credential)
    }
2
superarts.org

Swift

私の場合、swaggerクライアントライブラリを使用するときは、次のようにローカルサーバーをテストするようにコードを変更しました。

 open func createSessionManager() -> Alamofire.SessionManager {
    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = buildHeaders()

    let serverTrustPolicies: [String: ServerTrustPolicy] = ["localhost": .disableEvaluation]

    return Alamofire.SessionManager(configuration: configuration, serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))
}
0
Malder