web-dev-qa-db-fra.com

iOS 9.3: Une erreur SSL s'est produite et une connexion sécurisée au serveur ne peut pas être établie

Je reçois une erreur de suivi avec un certificat auto-signé

Domain Error = NSURLErrorDomain Code = -1200 "Une erreur SSL s'est produite et une connexion sécurisée au serveur ne peut pas être établie.

tout en testant les services Web pour l'une de mes applications de démonstration avec

Remarque: avant de supposer son Duplicate, je demande s'il vous plaît de le lire tout le long, même de la même manière que je l'ai signalé à Apple dev forums

Utilisation de Bibliothèque Alamofire


func testAlamofireGETRequest() -> Void
    {
        Alamofire.request(.GET, "https://filename.hostname.net/HelloWeb/service/greeting/john")
            .responseJSON
        { response in
            print("Response JSON: \(response.result.value)")
        }
}

Utilisation de NSURLSession


func testNSURLSessionRequest() -> Void {

        let session = NSURLSession.sharedSession()
        let urlString = "https://filename.hostname.net/HelloWeb/service/greeting/john"
        let url = NSURL(string: urlString)
        let request = NSURLRequest(URL: url!)
        let dataTask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
            print("done, error: \(error)")

            //Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made.
        }
        dataTask.resume()
    }

J'ai passé 2 jours sans chance :(

il y a un tas de questions déjà postées mais rien n'a fonctionné pour moi

a publié un problème avec Alamofire git


Mon fichier Info.pist est mis à jour pour les paramètres ATS de cette façon

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>filename.hostname.net</key>
            <dict>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
            </dict>
        </dict>
    </dict>

Pendant ce temps, je suis en mesure d'obtenir une réponse pour

http : //filename.hostname.net

et https : //google.com

mais pas pour https : //filename.hostname.net

Quelqu'un peut-il me suggérer pourquoi je ne suis pas en mesure de faire fonctionner cela après d'énormes efforts?

22
swiftBoy

Sur la ligne de commande dans OS X, exécutez ce qui suit:

nscurl --ats-diagnostics https://filename.hostname.net --verbose

Cela vous indiquera quelles combinaisons de paramètres ATS permettront et ne permettront pas à iOS d'accéder à votre site, et devrait vous indiquer ce qui ne va pas avec votre site.

Il peut s'agir d'un ou plusieurs des éléments suivants

  • Algorithme de hachage de certificat (doit être SHA-256 ou supérieur)
  • Version TLS (doit être 1.2)
  • Algorithmes TLS (doivent fournir Perfect Forward Secrecy)
41
yaakov

Apple a publié la liste complète des exigences pour App Transport Security.

Il s'est avéré que nous travaillions avec TLS v1.2 mais qu'il manquait certaines des autres exigences.

Voici la liste de contrôle complète :

  • TLS nécessite au moins la version 1.2.
  • Les chiffrements de connexion sont limités à ceux qui fournissent le secret de retransmission (voir ci-dessous pour la liste des chiffrements.)
  • Le service nécessite un certificat utilisant au moins une empreinte SHA256 avec une clé RSA de 2048 bits ou supérieure, ou une clé ECC (256 bits ou supérieure de courbe elliptique).
  • Les certificats non valides entraînent une défaillance matérielle et aucune connexion.
  • Les chiffres acceptés sont: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
8
TechnicalTophat

Je suppose que le serveur que vous essayez de connecter a des certificats invalides ou ne correspond pas aux normes iOS 9 pour ECC, Ciphers, etc.

  • Si vous utilisez des API de mise en réseau de haut niveau (NSURLSession, NSURLConnection ou tout autre élément superposé), vous n'avez pas de contrôle direct sur les suites de chiffrement proposées par le client. Ces API choisissent un ensemble de suites de chiffrement en utilisant leur propre logique interne.

  • Si vous utilisez des API de mise en réseau de niveau inférieur — CFSocketStream, via ses API NSStream et CFStream, et tout ce qui est inférieur à cela — vous pouvez choisir explicitement l'ensemble de suites de chiffrement que vous souhaitez utiliser. La façon dont vous procédez dépend de l'API spécifique.

La pratique standard est la suivante:

  1. créer la paire de flux

  2. le configurer pour TLS

  3. obtenir le contexte de transport sécurisé à l'aide de la propriété kCFStreamPropertySSLContext

  4. configurer des propriétés spécifiques dans ce contexte

  5. ouvrir les ruisseaux

Vous pouvez voir un exemple de cela dans l'exemple de code TLSTool. Plus précisément, regardez la classe TLSToolServer , où vous pouvez voir exactement cette séquence.

Dans un contexte très court, vous souhaitez configurer le flux de manière à contourner la sécurité, cependant, dans le cas d'Alamofire, vous pouvez le faire directement en:

func bypassAuthentication() {
        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)
        }
    }

faites-moi savoir si cela vous a été utile. Merci!

5
Fennec

J'ai eu le même scénario et je suis resté coincé pendant une journée. Essayez avec vos données mobiles, si cela fonctionne bien avec votre API, puis problème avec votre pare-feu réseau. puis activez SSL/TLS à partir des paramètres du pare-feu.

4
Hasya