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
请求的全部内容,该请求以前有效,但现在神秘地无效。它在我的设备或模拟器上不起作用。
这是与安全互联网连接有关的问题吗?或者这是另一个问题?
我看过的一些链接:
- https://github.com/AFNetworking/AFNetworking/issues/3999
- https://forums.developer.apple.com/thread/79025
- https://forums.developer.apple.com/thread/14221
编辑:
这是 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 相同的警告。但一切都奏效了。仅当我添加环境变量
时此警告才消失
我收到了一些 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
请求的全部内容,该请求以前有效,但现在神秘地无效。它在我的设备或模拟器上不起作用。
这是与安全互联网连接有关的问题吗?或者这是另一个问题?
我看过的一些链接:
- https://github.com/AFNetworking/AFNetworking/issues/3999
- https://forums.developer.apple.com/thread/79025
- https://forums.developer.apple.com/thread/14221
编辑:
这是 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 相同的警告。但一切都奏效了。仅当我添加环境变量