SSL_ERROR_SSL(1):库中的操作失败

Geo*_*e_E 45 spotify ios swift alamofire boringssl

我得到一些SSL Errors(这导致我的项目停止/挂起而没有崩溃,因为我DispatchGroup等待请求),我不知道它们是如何引起的,它们是什么,或者该怎么做.

我看过无数的网页大概这个问题,但目前还没有太多的文件或具有相同问题的人.我试过更改info.plist,但似乎没有帮助.两者都是plist这样的:( accounts.spotify.com是访问令牌请求的URL的域)

在此输入图像描述

当我向服务器发出请求时,我可以看到我的代码失败了.(这是我的框架).如前所述,我DispatchGroup等待这个请求但代码停止了.

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

我的要求方法:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定是什么导致了这个问题,因为我所做的只是稍微编辑并再次归档框架.

但是,之前它同时适用于两者(因为我正在使用这个通用框架脚本)

这是我的崩溃日志(我无法理解!):

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例程:OPENSSL_internal:SSL_HANDSHAKE_FAILURE:/ BuildRoot /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例程:OPENSSL_internal:SSL_HANDSHAKE_FAILURE:/ BuildRoot /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例程:OPENSSL_internal:SSL_HANDSHAKE_FAILURE:/ BuildRoot /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例程:OPENSSL_internal:SSL_HANDSHAKE_FAILURE:/ BuildRoot /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.0​​08365 + 0100 Songvote [4854:1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301)[C2.1:2] [0x107d7c600]获取输出帧失败,状态8196

2018-08-18 21:38:46.0​​08664 + 0100 Songvote [4854:1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301)[C2.1:2] [0x107d7c600]输出帧失败,状态8196

2018-08-18 21:38:46.0​​10037 + 0100 Songvote [4854:1517503] TIC阅读状态[2:0x0]:1:57

2018-08-18 21:38:46.0​​10215 + 0100 Songvote [4854:1517503] TIC阅读状态[2:0x0]:1:57

在此输入图像描述

这完全适用于以前工作过的Spotify请求Alamofire,现在神秘地没有.它不适用于我的设备模拟器.

这是一个与安全的互联网连接有关的问题吗?或者这是另一个问题吗?

我看到的一些链接:

编辑:

这是Spotify的服务器上的问题吗?或Xcode 10中的错误?我将框架.swift文件移动到我的项目中,仍然可以获取日志.

在我的请求之前我也遇到了这些错误,很奇怪.

这是握手错误,但我没有对此进行任何配置:

当您的浏览器向Web服务器发出安全连接请求时,将启动SSL握手.服务器将公钥发送到您的计算机,您的计算机将根据已知的证书颁发机构列表检查证书....通过故意导致握手失败来测试您的SSL功能.

我甚至尝试使用早期版本的checkout来反转所有更改(在早期版本中肯定完全正常)使用git,这对此没有任何影响.


编辑:临时解决方案:

似乎iOS 12不再适用于这些网络请求.我2天前向Apple发送了一个错误报告,希望他们能尽快解决这个问题.那我该怎么办?

嗯,就目前而言,我的iPhone 7没用,因为我在iOS 12测试版上.所以现在唯一的选择是在模拟器上运行我的项目.要做到这一点(就像你在Xcode 10 beta中,因为模拟器是iOS 12),请转到Xcode -> Preferences -> Components -> iOS 11.4 Simulator然后下载它.现在,当您选择模拟器时,请选择说出的模拟器iOS 11.4.

  • 这部分不再是真实的.

是什么导致这个?

虽然此错误不会影响任何内容,但是当您在iOS 12中运行项目时会导致此错误.据我所知,这不是安全问题.但是,我的代码未运行的问题是由于此错误导致的死锁而不是我认为的错误.

更新:Apple对我的错误报告做了什么

好吧,虽然我没有收到来自Apple的消息或任何内容,但报告被标记为"重复",正如其他人在我之前报告的那样.如果我得到有关什么时候修复的信息,我会在这里更新.


如果您有任何问题,提示或指示,请告诉我们!提前致谢!

Ste*_*cht 15

僵局

我假设将在主线程上调用spotifyRequest.

因此,如果主线程到达该行

group.wait()
Run Code Online (Sandbox Code Playgroud)

并且尚未调用此行的responseJSON completionHandler:

group.leave()
Run Code Online (Sandbox Code Playgroud)

然后由于上面的group.wait()调用,主线程被阻塞.由于主线程被阻塞,group.leave()无法被调用.经典的僵局.

Verfication

设置断点到该行

if let safeStatus = status {
Run Code Online (Sandbox Code Playgroud)

表明这条线永远不会被调用.

正在运行的最小示例

作为起点,这里是提供结果的最小示例的代码.

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

}
Run Code Online (Sandbox Code Playgroud)

这在控制台中作为输出:

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

看截图: 控制台输出

info.plist中的ATS设置

Spotify在其服务器上提供有效的TLS证书链.因此,info.plist中不需要ATS设置.

控制台中的SSL警告

当我在像你这样的iOS 12模拟器上运行应用程序时,我在控制台中收到相同的SSL警告.尽管如此,建立了连接并且请求提供了数据.也许这在下一个测试版中消失了.

  • 这也是一个非常详细的答案:) (2认同)