SSL_ERROR_SSL(1): 库内操作失败

SSL_ERROR_SSL(1): operation failed within the library

我收到了一些 SSL Error(这导致我的项目 stop/hang 没有崩溃,因为我有一个 DispatchGroup 正在等待请求),但我没有知道它们是如何引起的,它们是什么,或者如何处理。

我已经粗略阅读了很多关于这个问题的页面,但是没有太多的文档或遇到同样问题的人。我试过 changing the 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
    }
}

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

然而,早些时候它对两者都有效(因为我正在使用 this universal framework script

这是我的崩溃日志(我完全看不懂!):

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): operation failed within the library

2018-08-18 21:36:45.748123+0100 Songvote[4854:1517160] [BoringSSL] boringssl_session_handshake_error_print(205) [C2.1:2][0x107d7c600] 4427428040:error:100000d7:SSL routines: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): operation failed within the library

2018-08-18 21:36:45.748432+0100 Songvote[4854:1517160] [BoringSSL] boringssl_session_handshake_error_print(205) [C2.1:2][0x107d7c600] 4427428040:error:100000d7:SSL routines: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): operation failed within the library

2018-08-18 21:36:45.754640+0100 Songvote[4854:1517160] [BoringSSL] boringssl_session_handshake_error_print(205) [C2.1:2][0x107d7c600] 4427428040:error:100000d7:SSL routines: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): operation failed within the library

2018-08-18 21:36:45.754796+0100 Songvote[4854:1517160] [BoringSSL] boringssl_session_handshake_error_print(205) [C2.1:2][0x107d7c600] 4427428040:error:100000d7:SSL routines: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] get output frames failed, state 8196

2018-08-18 21:38:43.427656+0100 Songvote[4854:1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C1.1:2][0x107e1b4c0] get output frames failed, state 8196

2018-08-18 21:38:43.429723+0100 Songvote[4854:1517503] TIC Read Status [1:0x0]: 1:57

2018-08-18 21:38:43.429976+0100 Songvote[4854:1517503] TIC Read Status [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] get output frames failed, state 8196

2018-08-18 21:38:46.008664+0100 Songvote[4854:1517503] [BoringSSL] nw_protocol_boringssl_get_output_frames(1301) [C2.1:2][0x107d7c600] get output frames failed, state 8196

2018-08-18 21:38:46.010037+0100 Songvote[4854:1517503] TIC Read Status [2:0x0]: 1:57

2018-08-18 21:38:46.010215+0100 Songvote[4854:1517503] TIC Read Status [2:0x0]: 1:57

这是通过 Alamofire 发出的 Spotify 请求的全部内容,该请求以前有效,但现在神秘地无效。它在我的设备模拟器上不起作用。

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

我看过的一些链接:

编辑:

这是 Spotify 服务器的问题吗?或者 Xcode 10 中的错误?我将我的框架 .swift 文件移到了我的项目中,但仍然得到日志。

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

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

The SSL handshake is initiated when your browser issues a secure connection request to a Web server. The server sends a public key to your computer, and your computer checks the certificate against a known list of certificate authorities. ... Test your SSL functionality by intentionally causing the handshake to fail.

我什至尝试使用 git 在早期版本上进行结帐以撤消所有更改(这在早期版本中绝对可以正常工作),但这对此没有影响。


编辑:临时解决方案:

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

好吧,现在,我的 iPhone 7 没用了,因为我正在使用 iOS 12 beta。所以现在唯一的选择是 运行 我在模拟器上的项目。为此(就好像您在 Xcode 10 beta 中一样,因为模拟器是 iOS 12),请转到 Xcode -> Preferences -> Components -> iOS 11.4 Simulator 然后下载它。现在,当你 select 模拟器时,select 那些说 iOS 11.4.


这是什么原因造成的?

虽然这个错误应该不会产生任何影响,但它是在您 运行 您在 iOS 12 中的项目时引起的。据我所知,这不是安全问题。但是,我的代码不是 运行ning 的问题是由死锁引起的,而不是我认为是因为这个错误。

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

好吧,虽然我没有收到来自 Apple 的消息或任何信息,但该报告被标记为 'duplicate',因为有人在我之前报告过此问题。如果我得到任何关于何时修复的信息,我会在这里更新。


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

死锁

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

所以如果主线程到达该行

group.wait()

并且这行 responseJSON completionHandler 还没有被调用:

group.leave()

然后由于上面group.wait()的调用导致主线程被阻塞。 由于主线程阻塞 group.leave() 无法被调用。经典死锁。

验证

给行设置断点

if let safeStatus = status {

表明此行从未被调用。

最小示例 运行ning

这里的起点是提供结果的最小示例的代码。

import UIKit
import Alamofire

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.contactSpotify {
            print ("result: \(String(describing: [=13=])) error: \(String(describing: ))")
        }
    }

    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

见截图:

info.plist

中的 ATS 设置

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

控制台中的 SSL 警告

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

我在模拟器中的任何响应调用中都收到了与 codegen Swagger 相同的警告。但一切都奏效了。仅当我添加环境变量

时此警告才消失