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