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

j'obtiens l'erreur suivante avec le certificat auto signé

Error Domain=Nslerrordomain Code=-1200 " an SSL error has occurred et d'une connexion sécurisée au serveur ne peut pas être fait.

en testant des services web pour une de mes applications de démonstration avec

  • iOS 9.3
  • XCode 7.3
  • Swift 2.2
  • Alamofire 3.3.0
  • et serveur Local: https://filename.hostname.net

Note: avant d'assumer son double, je vous prie de le lire tout le chemin,même si j'ai rapporté aux forums apple dev

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

Utilisant 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 avec pas de chance :(

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

  • la sécurité des Transports a Bloqué un texte clair HTTP
  • iOS9 erreur d'obtention "une erreur ssl s'est produite et une connexion sécurisée au serveur ne peut pas être établie"
  • comment charger une URL HTTP avec la sécurité de Transport App activée dans iOS 9? [duplicate]
  • CFNetwork SSLHandshake failed iOS 9
  • Comment gérer "CFNetwork SSLHandshake a échoué" dans iOS
  • fabrication Requête HTTPS dans iOS 9 avec le certificat auto-signé
  • ios9 certificat auto-signé et de l'application de la sécurité des transports

posté Alamofire git question

  • 'CFNetwork SSLHandshake échoué (-9847)" erreur lors de l'exécution d'une demande non-SSL #538
  • certificat auto-signé Non accepté #876
  • Comment puis-je connecter mon serveur en tant que HTTPS en utilisant le fichier de certificat auto-signé # 977

Mon Info.le fichier 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>

en attendant 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

est-ce que quelqu'un peut me suggérer pourquoi je ne suis pas en mesure d'obtenir ce travail après d'énormes efforts?

19
demandé sur Community 2016-03-31 14:05:38

4 réponses

je présume que le serveur que vous essayez de connecter a des certificats invalides ou ne correspond pas aux normes iOS 9 pour ECC, chiffreurs, etc.

  • si vous utilisez des API de réseau de haut niveau-NSURLSession, NSURLConnection, ou n'importe quoi superposé sur ceux-ci-vous n'avez pas de contrôle direct sur les suites de cypher offertes par le client. Ces API choisissent un ensemble de suites cypher en utilisant leur propre logique interne.

  • si vous utilisez des API de réseau de niveau inférieur-CFSocketStream, via ses API Nsstream et CFStream, et tout ce qui est inférieur-vous pouvez choisir explicitement l'ensemble des suites cypher que vous voulez utiliser. La manière de procéder dépend de L'API spécifique.

la pratique standard est:

  1. créer le flux paire

  2. le configurer pour TLS

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

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

  5. ouvrir les volets

vous pouvez voir un exemple de ceci dans le code D'échantillon TLSTool. Plus précisément, regardez le TLSToolServer classe, où vous pouvez voir exactement cette séquence.

En très peu de contexte, vous souhaitez configurer le flux de telle manière qu'il contourne la sécurité, toutefois, dans le cas de Alamofire vous pouvez le faire directement par:

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

dites-moi si ça aide. Je vous remercie!

4
répondu Fennec 2016-03-31 11:16:33

à la ligne de commande dans OS X, lancez ce qui suit:

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

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

il pourrait s'agir d'un ou plusieurs des suivants

  • algorithme de hachage de certificat (doit être SHA-256 ou supérieur)
  • version TLS (doit être 1,2)
  • TLS algorithmes (Perfect Forward Secrecy)
38
répondu yaakov 2016-04-01 11:20:39

Apple a publié la liste complète des exigences pour la sécurité de Transport App.

S'est avéré que nous travaillions avec TLS v1.2 mais ne répondaient pas à certaines autres exigences.

Voici la liste de contrôle complète :

  • TLS nécessite au moins la version 1.2.
  • Les chiffres de connexion
  • sont limités à ceux qui assurent le secret (voir ci-dessous pour la liste des chiffrement.)
  • le service nécessite un certificat utilisant au moins une empreinte sha256 avec une clé RSA de 2048 bits ou plus, ou une clé de 256bit ou plus à courbe elliptique (ECC).
  • les certificats invalides entraînent une panne 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
répondu TechnicalTophat 2017-03-22 12:08:03

j'ai eu le même scénario et suis restée un jour. Essayez avec vos données mobiles, si cela fonctionne bien avec votre API, alors problème avec votre pare-feu réseau. ensuite, activez SSL / TLS à partir des paramètres du pare-feu.

3
répondu Hasya 2016-04-01 11:25:33