SSL_ERROR_SSL(1): операция не удалась в библиотеке

Я получаю немного SSL Error s (которые приводят к остановке / зависанию моего проекта без сбоев, так как у меня есть DispatchGroup в ожидании запроса), который я не знаю, как они вызваны, что они, или что с этим делать.

Я прочитал множество страниц примерно об этой проблеме, но не так много документации или людей, имеющих такую ​​же проблему. Я пытался изменить info.plist, но это, похоже, не помогло. И то и другое plist вот так: (accounts.spotify.com это домен для URL запроса токена доступа)

введите описание изображения здесь

Я вижу, что мой код не работает, когда я делаю запрос к серверу. (Это в моих рамках). Как упоминалось ранее, у меня есть DispatchGroup жду этого запроса, но код останавливается.

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

Мой метод запроса:

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

Я не совсем уверен, что вызвало проблему, потому что все, что я сделал, это немного отредактировал и снова заархивировал фреймворк.

Однако ранее это работало на обоих (поскольку я использую этот универсальный каркасный скрипт)

Вот мой журнал сбоев (чего я не понимаю!):

2018-08-18 21: 36: 45.747984 + 0100 Songvote [4854: 1517160] [BoringSSL] boringssl_session_errorlog (224) [C2.1: 2] [0x107d7c600] [boringssl_session_read] SSL_ERROR_SSL (1): сбой операции в библиотеке

2018-08-18 21:36:45.748123+0100 Songvote[4854:1517160] [BoringSSL] boringssl_session_handshake_error_print(205) [C2.1:2][0x107d7c600] 4427428040: ошибка: 100000d7: подпрограммы SSL:OPENSS_HOL_SH: /Library/Caches/com.apple.xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_lib.cc:1081:

2018-08-18 21: 36: 45.748238 + 0100 Songvote [4854: 1517160] [BoringSSL] boringssl_session_errorlog (224) [C2.1: 2] [0x107d7c600] [boringssl_session_read] SSL_ERROR_SSL (1): сбой операции в библиотеке

2018-08-18 21:36:45.748432+0100 Songvote[4854:1517160] [BoringSSL] boringssl_session_handshake_error_print(205) [C2.1:2][0x107d7c600] 4427428040: ошибка: 100000d7: подпрограммы SSL:OPENSS_HIL_HIL /Library/Caches/com.apple.xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_lib.cc:1081:

2018-08-18 21: 36: 45.754554 + 0100 Songvote [4854: 1517160] [BoringSSL] boringssl_session_errorlog (224) [C2.1: 2] [0x107d7c600] [boringssl_session_read] SSL_ERROR_SSL (1): сбой операции в библиотеке

2018-08-18 21:36:45.754640+0100 Songvote[4854:1517160] [BoringSSL] boringssl_session_handshake_error_print(205) [C2.1:2][0x107d7c600] 4427428040: ошибка: 100000d7: подпрограммы SSL:OPENSS_HIL_SH: /Library/Caches/com.apple.xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_lib.cc:1081:

2018-08-18 21: 36: 45.754717 + 0100 Songvote [4854: 1517160] [BoringSSL] boringssl_session_errorlog (224) [C2.1: 2] [0x107d7c600] [boringssl_session_read] SSL_ERROR_SSL (1): сбой операции в библиотеке

2018-08-18 21:36:45.754796+0100 Songvote[4854:1517160] [BoringSSL] boringssl_session_handshake_error_print(205) [C2.1:2][0x107d7c600] 4427428040: ошибка: 100000d7: подпрограммы SSL:OPENSS_HOL_SH: /Library/Caches/com.apple.xbs/Sources/boringssl/boringssl-109.200.32/ssl/ssl_lib.cc:1081:

2018-08-18 21: 38: 43.427156 + 0100 Songvote [4854: 1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames (1301) [C1.1: 2] [0x107e1b4c0] получить выходные кадры не удалось, состояние 8196

2018-08-18 21: 38: 43.427656 + 0100 Songvote [4854: 1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames (1301) [C1.1: 2] [0x107e1b4c0] получить выходные кадры не удалось, состояние 8196

2018-08-18 21: 38: 43.429723 + 0100 Songvote [4854: 1517503] Статус чтения TIC [1: 0x0]: 1:57

2018-08-18 21: 38: 43.429976 + 0100 Songvote [4854: 1517503] Статус чтения TIC [1: 0x0]: 1:57

2018-08-18 21: 38: 46.008365 + 0100 Songvote [4854: 1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames (1301) [C2.1: 2] [0x107d7c600] получить выходные кадры не удалось, состояние 8196

2018-08-18 21: 38: 46.008664 + 0100 Songvote [4854: 1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames (1301) [C2.1: 2] [0x107d7c600] получить выходные кадры не удалось, состояние 8196

2018-08-18 21: 38: 46.010037 + 0100 Songvote [4854: 1517503] Статус чтения TIC [2:0x0]: 1:57

2018-08-18 21: 38: 46.010215 + 0100 Songvote [4854: 1517503] Статус чтения TIC [2:0x0]: 1:57

введите описание изображения здесь

Это все для Spotify запрос через Alamofire который раньше работал, а теперь таинственным образом не работает. Это не работает на моем устройстве ИЛИ симуляторе.

Это проблема, связанная с безопасным подключением к интернету? Или это другая проблема?

Некоторые ссылки на то, на что я смотрел:

Редактирование:

Это проблема на серверах Spotify? Или ошибка в Xcode 10? Я переместил мои рамки .swift файлы в мой проект, и все еще получать журналы.

Я тоже получаю эти ошибки до моего запроса, странно.

Это ошибка рукопожатия, но я не настраиваю это:

Рукопожатие SSL инициируется, когда ваш браузер отправляет запрос на безопасное подключение к веб-серверу. Сервер отправляет открытый ключ на ваш компьютер, а ваш компьютер проверяет сертификат по известному списку центров сертификации.... Проверьте работоспособность SSL, умышленно вызывая сбой рукопожатия.

Я даже попробовал оформить заказ на более ранней версии, чтобы отменить все изменения (которые в предыдущих версиях работали совершенно нормально), используя git, что никак не повлияло на это.


Изменить: временное решение:

Похоже, что iOS 12 больше не работает с этими сетевыми запросами. Я отправил отчет об ошибке в Apple 2 дня назад, так что, надеюсь, они исправят это в ближайшее время. Так что я сделал?

Ну, пока, мой iPhone 7 бесполезен, поскольку я нахожусь на бета-версии iOS 12. Так что пока единственный вариант - запустить мой проект на симуляторе. Чтобы сделать это (как будто вы находитесь в бета-версии Xcode 10, потому что симуляторы - iOS 12), перейдите к Xcode -> Preferences -> Components -> iOS 11.4 Simulator а затем скачать его. Теперь, когда вы выбираете симулятор, выберите те, которые говорят iOS 11.4,

  • Эта часть больше не соответствует действительности.

Что вызывает это?

Хотя эта ошибка ни на что не влияет, она возникает, когда вы запускаете свой проект в iOS 12. Насколько я знаю, это НЕ проблема безопасности. Однако моя проблема с неработающим кодом была вызвана взаимоблокировкой, а не тем, что я думал, было из-за этой ошибки.

Обновление: что Apple сделала с моим сообщением об ошибке

Ну, хотя я не получил сообщение или что-то от Apple, отчет помечен как "дубликат", так как кто-то еще сообщил об этом до меня. Если я получу какую-либо информацию о том, когда она будет исправлена, я обновлю ее здесь.


Если у вас есть какие-либо вопросы, советы или указатели, пожалуйста, дайте мне знать! Заранее спасибо!

1 ответ

Решение

тупик

Я предполагаю, что spotifyRequest будет вызываться в основном потоке.

Так что, если основной поток достигает линии

group.wait()

и эта строка ответа JSON завершение Handler еще не был вызван:

group.leave()

тогда основной поток блокируется из-за вызова group.wait() выше. Из-за заблокированного основного потока group.leave() не может быть вызван. Классический тупик.

Verfication

Установка точки останова на линию

if let safeStatus = status {

показывает, что эта строка никогда не называется.

Минимальный пример, который работает

В качестве отправной точки здесь приведен код для минимального примера, который дает результат.

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

}

Это дает как вывод в консоли:

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

смотрите скриншот: консольный вывод

Настройки ATS в info.plist

Spotify предлагает действительную цепочку сертификатов TLS на своем сервере. Таким образом, нет необходимости в настройках ATS в info.plist.

Предупреждения SSL в консоли

Я получаю те же предупреждения SSL в консоли, когда запускаю приложение на симуляторе iOS 12, как вы. Тем не менее соединение установлено и запрос доставляет данные. Возможно, это пропало в одной из следующих бета-версий.

У меня было то же предупреждение с Codegen Swagger в эмуляторе при любом ответном вызове. Но все сработало. Это предупреждение исчезло, только когда я добавил переменную окружения Скрыть странные нежелательные журналы XCode

Другие вопросы по тегам