web-dev-qa-db-fra.com

Comment connecter localhost (avec un certificat invalide) en utilisant Alamofire?

Ceci est mon premier projet utilisant Swift. Je suis usin alamofire pour connecter l'API. J'ai une copie locale de l'API que je veux utiliser pour le débogage - afin de pouvoir définir des données de test - car l'API distante contient déjà des données réelles avec lesquelles je ne peux pas jouer.

Le problème est que je reçois l'erreur ci-dessous lorsque j'essaie d'accéder à https://localhost:8443/MyProject

Facultatif (Domaine d'erreur = Code NSURLErrorDomain = -1202 "Le certificat de ce serveur n'est pas valide. Vous vous connectez peut-être à un serveur prétendant être« hôte local », ce qui pourrait mettre en péril vos informations confidentielles." UserInfo = 0x7fbeb8c61ff0 {NSURLErrorFailingURLPeerTrustErrorKey = , NSLocalizedRecoverySuggestion = Souhaitez-vous vous connecter au serveur malgré tout ?, _kCFStreamErrorCodeKey = -9813, NSUnderlyingError = 0x7fbeb8ea5c00 "L'opération n'a pas pu être effectuée. (Erreur kCFErrorDomainCFNetwork - -1202.)," Vous vous connectez peut-être à un serveur prétendant être “hôte local” qui pourrait mettre en péril vos informations confidentielles., NSErrorFailingURLKey = https: // localhost: 8443/myproject/api/loginUser.pdo , NSErrorFailingURLStringKey = https: // localhost: 8443/myproject/api/loginUser.pdo , _kCFStreamErrorDomainKey = 3})

J'ai trouvé beaucoup de solutions pour la plupart d'entre elles pour Objective-c en utilisant setAllowsAnyHTTPSCertificate ou en utilisant le délégué pour la connexion. mais je ne pouvais pas trouver une méthode equevelent pour setAllowsAnyHTTPSCertificate dans Swift, et je ne savais pas comment définir le délégué sur la connexion en utilisant alamofire. des idées ce que je dois faire?

  • Je sais que setAllowsAnyHTTPSCertificate est une api privée et entraînera le rejet du projet par Apple. Je veux l'utiliser uniquement pendant le débogage, il sera supprimé avant la publication du projet.

Merci d'avance.

14
Ismail

Vous pouvez facilement remplacer le comportement de test par défaut dans Alamofire à l'aide des fermetures SessionDelegate. Voici un exemple de la manière dont vous pouvez autoriser Alamofire à accepter des certificats non valides:

IMPORTANT: Veuillez ne pas utiliser ceci dans aucun code de production. La sécurité est TRÈS importante et cette implémentation ignore complètement les mécanismes de sécurité d’Alamofire. À utiliser à vos risques et périls!

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)
}

Nous (le Alamofire TC ) allons implémenter l’épinglage TLS et plusieurs autres fonctionnalités liées à la sécurité dans la version Alamofire 1.3.0 .


METTRE À JOUR

La version Alamofire 1.3.0 est sortie et ajoute BEAUCOUP un meilleur support pour la personnalisation des problèmes d'authentification de confiance du serveur. Pour plus d'informations, veuillez consulter la section Sécurité du fichier README.

20
cnoon

Swift 3 version du code de @ cnoon

    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 3  

Dans mon cas, lorsque j'utilise la bibliothèque client swagger, j'ai modifié mon code pour tester le serveur local de la manière suivante:

 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