SSL_ERROR_SSL(1):库中的操作失败
我收到一些SSL Error
(这导致我的项目停止/挂起而没有崩溃,因为我有一个等待请求的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例程: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.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
这一切都是针对通过Alamofire
提出的Spotify
请求,该请求之前Alamofire
过工作,而现在神秘却没有。 它不适用于我的设备或模拟器。
这是一个与安全互联网连接有关的问题吗? 或者这是另一个问题吗?
我看到的一些链接:
- https://github.com/AFNetworking/AFNetworking/issues/3999
- NSURLSession“HTTP加载失败kCFStreamErrorDomainSSL,-9813;自签名证书
- https://forums.developer.apple.com/thread/79025
- https://forums.developer.apple.com/thread/14221
- iOS 9.3:发生SSL错误,无法与服务器建立安全连接
- iOS9收到错误“发生了ssl错误,无法与服务器建立安全连接”
编辑:
这是Spotify的服务器上的问题吗? 或Xcode 10中的错误? 我将框架.swift
文件移动到我的项目中,仍然获取日志。
我也在我的要求之前得到了这些错误,奇怪🤔。
这是握手错误,但我不做任何配置:
当您的浏览器向Web服务器发出安全连接请求时,将启动SSL握手。 服务器将公钥发送到您的计算机,您的计算机将根据已知的证书颁发机构列表检查证书。 …通过故意导致握手失败来测试您的SSLfunction。
我甚至尝试使用早期版本的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中运行项目时会导致此错误。据我所知,这不是安全问题。 但是,我的代码未运行的问题是由于此错误导致的死锁而不是我认为的错误。
如果您有任何问题,提示或指示,请告诉我们! 提前致谢!
僵局
我假设将在主线程上调用spotifyRequest。
所以如果主线程到达该行
group.wait()
并且尚未调用此行的responseJSON completionHandler:
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": "", "refresh_token": "", "client_secret": ""]) .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警告。 尽管如此,建立了连接并且请求提供了数据。 也许这在下一个测试版中消失了。