web-dev-qa-db-fra.com

iOS 10.3: simulateur HTTPS localhost: erreur SSL

Cela fonctionnait parfaitement pour iOS 10.2 et les versions antérieures, mais après la mise à niveau vers la version 10.3, lorsque le simulateur tente de se connecter via HTTPS au serveur de développement s'exécutant sur localhost, la console Xcode génère les erreurs suivantes:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
[] nw_coretls_callback_handshake_message_block_invoke_3 tls_handshake_continue: [-9807]

Imprimer la error renvoyée par la URLSessionDataTask montre:

Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x600000527080>, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=(
    "<cert(0x7ff3e1867200) s: localhost i: localhost>"
), NSUnderlyingError=0x60800024e880 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x600000527080>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=(
    "<cert(0x7ff3e1867200) s: localhost i: localhost>"
)}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://localhost:3000/v1/login, NSErrorFailingURLStringKey=https://localhost:3000/v1/login, NSErrorClientCertificateStateKey=0}

Référence: Apple: Développeur: Guides et exemples de code: note technique TN2232: Évaluation de la confiance du serveur HTTPS


Pour créer un certificat SSL auto-signé, j'ai utilisé les commandes suivantes:

openssl genrsa -aes256 -passout pass:x -out server.pass.key 2048
openssl rsa -passin pass:x -in server.pass.key -out server.key
rm server.pass.key
openssl req -new -sha256 -key server.key -out server.csr -subj /CN=localhost
openssl x509 -req -sha512 -days 365 -in server.csr -signkey server.key -out server.crt

Source: GitHub - seviu/iOS-SSL-localhost

8
ma11hew28

Après avoir installé votre certificat SSL auto-signé (en le glissant-déposant) sur iPhone Simulator, accédez à Paramètres> Général> À propos de> Paramètres d'approbation de certificat et activez la confiance totale pour votre certificat.

10
ma11hew28

J'ai également eu le même problème, vous devez implémenter la méthode déléguée didRecieveChallenge pour gérer les erreurs SSl 

Ajoutez ci-dessous l'un des codes de la méthode déléguée didReceiveChallenge des méthodes déléguées URLSession ou de la méthode URLConnnection deleagte.

- (void)URLSession :( NSURLSession *)session didReceiveChallenge :( NSURLAuthenticationChallenge *)challenge completionHandler :( void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler {   NSURLSessionAuthChallengeDisposition lDisposition = NSURLSessionAuthChallengeUseCredential;
NSURLCredential *credential = [[NSURLCredential alloc] init];


if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
    credential = [NSURLCredential credentialForTrust: challenge.protectionSpace.serverTrust];
    lDisposition = NSURLSessionAuthChallengeUseCredential;
}
completionHandler(lDisposition, credential);}
0
Kishor