web-dev-qa-db-fra.com

SSL_ERROR_SSL (1): l'opération a échoué dans la bibliothèque

Je reçois des SSL Errors (qui causent l’arrêt/le blocage de mon projet sans crash car j’ai une variable DispatchGroup en attente de la demande), dont je ne sais pas comment ils sont causés, ce qu’ils sont ou quoi faire. .

J'ai lu de nombreuses pages à peu près sur ce problème, mais il n'y a pas beaucoup de documentation ou de personnes qui ont le même problème. J'ai essayé changer l'info.plist mais cela ne semble pas avoir aidé. plist 's ressemble à ceci: (accounts.spotify.com est le domaine de l'URL de la demande de jeton d'accès)

 enter image description here

Je peux voir que mon code échoue lorsque je fais une demande au serveur. (Ceci est dans mon cadre). Comme mentionné précédemment, j'ai une DispatchGroup en attente de cette demande mais le code s'arrête.

self.currentToken = try self.spotifyRequest("https://accounts.spotify.com/api/token", method: .post, parameters: parameters)

Ma méthode de demande:

private func spotifyRequest(_ url: URLConvertible, method: HTTPMethod, parameters: Parameters? = nil, headers: HTTPHeaders? = nil) throws -> JSONStandard {
    // Create a dispatch group to handle threads
    let group = DispatchGroup()
    group.enter()

    // Status of the request (starts as nil)
    var status: JSONStandard?


    DispatchQueue.global(qos: .userInitiated).async {
        Alamofire.request(url, method: method, parameters: parameters, headers: headers).responseJSON(completionHandler: { response in
            // Check if response is valid
            if let requestResponse = response.result.value as? JSONStandard {
                status = requestResponse
            } else {
                status = nil
            }

            // Let the next tasks be completed, it has finished waiting for the request
            group.leave()
        })
    }


    // Wait for a result
    group.wait()

    // Return value or throw an error
    if let safeStatus = status {
        return safeStatus
    } else {
        getAccessToken()
        throw SpotifyError.failedToCompleteRequest
    }
}

Je ne sais pas exactement ce qui a causé le problème, car tout ce que j'ai fait a été de modifier légèrement et d'archiver à nouveau le cadre.

Cependant, auparavant, cela fonctionnait à la fois (car j'utilise ce script de framework universel )

Voici mon journal des collisions (que je ne comprends pas!):

2018-08-18 21: 36: 45.747984 + 0100 votes de vote [4854: 1517160] [BoringSSL] boringssl_session_errorlog (224) [C2.1: 2] [0x107d7c600] [boringssl_session_read] SSL_ERROR_SSL (1): l'opération a échoué dans la bibliothèque

2018-08-18 21: 36: 45.748123 + 0100 Songvote [4854: 1517160] bingsSSl_session_handshake_error_print (205) [C2.1: 2] [0x107d7c600] 4427428040: erreur: routines SSL: OPENL_in: /Library/Caches/com.Apple.xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_lib.cc:1081:

2018-08-18 21: 36: 45.748238 + 0100 votes de vote [4854: 1517160] [BoringSSL] boringssl_session_errorlog (224) [C2.1: 2] [0x107d7c600] [boringssl_session_read] SSL_ERROR_SSL (1): l'opération a échoué dans la bibliothèque

2018-08-18 21: 36: 45.748432 + 0100 Songvote [4854: 1517160] [BoringSSL] boringssl_session_handshake_error_print (205) [C2.1: 2] [0x107d7c600] 4427428040: erreur: 1002d7: erreur de production /Library/Caches/com.Apple.xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_lib.cc:1081:

2018-08-18 21: 36: 45.754554 + 0100 votes de vote [4854: 1517160] [BoringSSL] boringssl_session_errorlog (224) [C2.1: 2] [0x107d7c600] [boringssl_session_read] SSL_ERROR_SSL (1): l'opération a échoué dans la bibliothèque

2018-08-18 21: 36: 45.754640 + 0100 Songvote [4854: 1517160] [BoringSSL] boringssl_session_handshake_error_print (205) [C2.1: 2] [0x107d7c600] 4427428040: Erreur: 1002d7: erreur de production: /Library/Caches/com.Apple.xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_lib.cc:1081:

2018-08-18 21: 36: 45.754717 + 0100 votes de vote [4854: 1517160] [BoringSSL] boringssl_session_errorlog (224) [C2.1: 2] [0x107d7c600] [boringssl_session_read] SSL_ERROR_SSL (1): l'opération a échoué dans la bibliothèque

2018-08-18 21: 36: 45.754796 + 0100 Songvote [4854: 1517160] [BoringSSL] boringssl_session_handshake_error_print (205) [C2.1: 2] [0x107d7c600] 4427428040: Erreur: 1002d7: erreur de stockage: /Library/Caches/com.Apple.xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_lib.cc:1081:

2018-08-18 21: 38: 43.427156 + 0100 votes de vote [4854: 1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames (1301) [C1.1: 2] [0x107e1b4c0] échec de l'obtention des trames de sortie, état 8196.

2018-08-18 21: 38: 43.427656 + 0100 votes de vote [4854: 1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames (1301) [C1.1: 2] [0x107e1b4c0] échec de l'obtention des trames de sortie, état 8196.

2018-08-18 21: 38: 43.429723 + 0100 votes de vote [4854: 1517503] Statut de lecture de TIC [1: 0x0]: 1:57

2018-08-18 21: 38: 43.429976 + 0100 votes de vote [4854: 1517503] Statut de lecture de TIC [1: 0x0]: 1:57

2018-08-18 21: 38: 46.008365 + 0100 votes de vote [4854: 1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames (1301) [C2.1: 2] [0x107d7c600] échec des cadres de sortie, état 8196

2018-08-18 21: 38: 46.008664 + 0100 votes de vote [4854: 1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames (1301) [C2.1: 2] [0x107d7c600] échec des cadres de sortie, état 8196

2018-08-18 21: 38: 46.010037 + 0100 votes de vote [4854: 1517503] Statut de lecture de TIC [2: 0x0]: 1:57

2018-08-18 21: 38: 46.010215 + 0100 votes de vote [4854: 1517503] Statut de lecture de TIC [2: 0x0]: 1:57

 enter image description here

C’est tout pour une requête Spotify à travers Alamofire qui fonctionnait auparavant et qui, mystérieusement, ne fonctionne plus. Cela ne fonctionne pas sur mon appareilOUle simulateur.

Est-ce un problème lié aux connexions Internet sécurisées? Ou est-ce un autre problème?

Quelques liens vers ce que j'ai regardé:

Éditions:

Est-ce un problème sur les serveurs de Spotify? Ou un bug dans Xcode 10? J'ai déplacé mes fichiers framework .Swift dans mon projet et j'obtiens toujours les journaux.

Je reçois aussi ces erreurs avant ma demande, étrange ????.

C’est ce qu’est une erreur de négociation, mais je ne fais aucune configuration de ceci:

L'établissement de la liaison SSL est lancé lorsque votre navigateur envoie une demande de connexion sécurisée à un serveur Web. Le serveur envoie une clé publique à votre ordinateur, lequel vérifie le certificat par rapport à une liste connue d'autorités de certification. ... Testez votre fonctionnalité SSL en provoquant intentionnellement l'échec de la négociation.

J'ai même essayé de passer à la caisse sur une version antérieure pour annuler toutes les modifications (qui fonctionnaient parfaitement dans les versions précédentes) en utilisant git, ce qui n'a eu aucune incidence sur ce point.


Edit: La solution temporaire:

Il semble que iOS 12 ne fonctionne plus avec ces requêtes réseau. J'ai envoyé un rapport de bogue à Apple il y a 2 jours, alors j'espère qu'ils vont le réparer rapidement. Alors qu'est-ce que j'ai fait?

Eh bien, pour le moment, mon iPhone 7 est inutile comme je le suis sur iOS 12 beta. Donc, la seule option pour le moment est d’exécuter mon projet sur le simulateur. Pour ce faire (comme si vous utilisiez Xcode 10 beta car les simulateurs sont iOS 12), accédez à Xcode -> Preferences -> Components -> iOS 11.4 Simulator puis téléchargez-le. Maintenant, lorsque vous sélectionnez un simulateur, sélectionnez ceux qui disent iOS 11.4.

  • _ {Cette partie n'est plus vraie.

Qu'est-ce qui cause ça?

Bien que cette erreur ne devrait avoir aucune incidence, elle est générée lorsque vous exécutez votre projet dans iOS 12. Autant que je sache, il ne s'agit PAS d'un problème de sécurité. Cependant, le problème de mon code qui ne fonctionnait pas était dû à un blocage au lieu de ce que je pensais être à cause de cette erreur.

Mise à jour: ce qu'Apple a fait à propos de mon rapport de bogue

Eh bien, bien que je n’aie reçu aucun message ou quoi que ce soit d’Apple, le rapport est marqué comme un «duplicata», comme l’avait déjà signalé un autre avant moi. Si je reçois des informations sur le moment où cela sera corrigé, je le mettrai à jour ici.


Si vous avez des questions, des conseils ou des indications, merci de me le faire savoir! Merci d'avance!

40
George_E

Impasse

Je suppose que spotifyRequest sera appelé sur le thread principal.

Donc, si le fil principal atteint la ligne

group.wait()

et cette ligne de responseJSON completionHandler n'a pas encore été appelée:

group.leave()

alors le thread principal est bloqué à cause de l'appel de group.wait () ci-dessus. En raison du thread principal bloqué, group.leave () ne peut pas être appelé. Impasse classique.

Verfication

Définition d'un point d'arrêt sur la ligne

if let safeStatus = status {

montre que cette ligne n'est jamais appelée.

Exemple minimal qui exécute

Pour commencer, voici le code d’un exemple minimal qui donne un résultat.

import UIKit
import Alamofire

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.contactSpotify {
            print ("result: \(String(describing: $0)) error: \(String(describing: $1))")
        }
    }

    func contactSpotify(completion: @escaping ([String: Any]?, Error?) -> Void) {
        let url = URL(string: "https://accounts.spotify.com/api/token")!
        Alamofire.request(url,
                          method: .post,
                          parameters: ["grant_type": "refresh_token",
                                       "client_id": "<someClientId>",
                                       "refresh_token": "<someRefreshToken>",
                                       "client_secret": "<someClientSecret>"])
            .validate()
            .responseJSON { response in
                guard response.result.isSuccess else {
                    completion(nil, response.result.error)
                    return
                }

                completion(response.result.value as? [String: Any], nil)
        }
    }

}

Cela donne en sortie dans la console:

result: Optional(["access_token": XXX, "scope": user-read-email user-read-private, "token_type": Bearer, "expires_in": 3600]) error: nil

voir Capture:  console output

Paramètres ATS dans info.plist

Spotify offre une chaîne de certificats TLS valide sur leur serveur. Il n’ya donc pas besoin de réglages ATS dans info.plist. 

Avertissements SSL dans la console

Je reçois les mêmes avertissements SSL dans la console lorsque je lance l'application sur un simulateur iOS 12 comme vous. Néanmoins, la connexion est établie et la demande fournit des données. Peut-être que cela est parti dans l'un des prochains bétas. 

13
Stephan Schlecht

J'ai eu le même avertissement avec codegen Swagger dans l'émulateur pour tout appel de réponse. Mais tout a fonctionné. Cet avertissement a disparu uniquement lorsque j'ai ajouté la variable d'environnement Masquer les journaux Xcode non désirés

0
Zhebzhik Babich