【问题标题】:SSL_ERROR_SSL(1): operation failed within the librarySSL_ERROR_SSL(1):库内操作失败
【发布时间】:2019-01-25 12:01:08
【问题描述】:

我收到了一些 SSL Errors(这导致我的项目停止/挂起而没有崩溃,因为我有一个 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):操作失败图书馆

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_HANDS 例程:OPENFAILUREH :/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:error:100000d7:SSL_HANDS 例程:OPENFAILUREH :/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:error:100000d7:SSL_HANDSroutines:OPENFAILUREH :/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_HANDS 例程:OPENFAILUREH :/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 请求,该请求以前有效,但现在神秘地无效。它不适用于我的设备模拟器。

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

我看过的一些链接:

编辑:

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

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

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

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

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


编辑:临时解决方案:

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

好吧,现在我的 iPhone 7 没用,因为我在 iOS 12 测试版上。所以目前唯一的选择是在模拟器上运行我的项目。为此(就像您在 Xcode 10 测试版中一样,因为模拟器是 iOS 12),请转到 Xcode -> Preferences -> Components -> iOS 11.4 Simulator 然后下载它。现在,当您选择模拟器时,请选择带有iOS 11.4 的模拟器。

  • 这部分不再正确。

是什么原因造成的?

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

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

好吧,虽然我没有收到来自 Apple 的消息或任何内容,但该报告被标记为“重复”,因为其他人在我之前报告了这件事。如果我得到任何关于何时修复的信息,我会在这里更新。


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

【问题讨论】:

  • 我遇到了同样的问题。我的应用程序在 iOS
  • @Travo 很高兴不仅仅是我!我还连接到https,所以AppTransportSecurity 设置可能不会有什么不同,因为它应该是一个非常安全的网络(考虑到我连接到两个大型公司,SpotifyGoogle's Firebase)。跨度>
  • 我感觉到你了。新的 Swift 版本,一年两次。我还发现了很多关于 iOS 12 beta 2 中 SSL 故障的问题报告。我很想想象手头的问题仅限于当前发布的 iOS 12 beta 7。我真的不知道如何解决这个问题。这似乎是我们无法控制的操作系统故障。
  • 我遇到了同样的问题。几天前,我们的应用程序在 iOS 12 之前一直运行良好,但现在我们遇到了一系列错误,这导致我们的应用程序完全死锁。你解决了这个问题吗?看我最新的帖子。渴望解决方案:stackoverflow.com/questions/52565371/…
  • 哇@George_E_2...你完全正确。一旦我尝试将连接到数据库的尝试移出 AppDelegate,我就可以再次正常连接,而不会在控制台中出现错误。知道为什么会这样/为什么 iOS 12 会改变这一点吗?

标签: ios swift alamofire spotify boringssl


【解决方案1】:

死锁

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

所以如果主线程到达该行

group.wait()

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

group.leave()

然后主线程由于上面的 group.wait() 调用而被阻塞。 由于阻塞的主线程 group.leave() 不能被调用。经典僵局。

验证

给行设置断点

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

见截图:

info.plist 中的 ATS 设置

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

控制台中的 SSL 警告

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

【讨论】:

  • 我意识到在那之后我陷入了僵局......实际上我现在正在修复它们。但这是正确的答案,警告只是由于 iOS 12
  • 这也是一个非常详细的答案:)
  • 我知道已经有一段时间了,但出于好奇,为什么选择调度组而不是 Promises? (比如 BFTasks,或者像 RxSwift 这样的 observables)决定因素是什么?
  • @Alex 我现在已经放弃了这个应用程序......无论如何,我对 Alamofire 很陌生,而且没有经验。我仍然是,因为我不再使用它了。但我不知道 Promises 是什么,所以这是我当时的解决方案。真正的问题是在异步线程上同步返回一个值,但我这样做是因为我试图为未来的项目创建一个框架。
【解决方案2】:

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

时,此警告才消失

【讨论】:

  • 不幸的是,这会使来自模拟器的日志或其他可能有用的信息静音。
猜你喜欢
  • 2014-07-16
  • 2012-08-18
  • 1970-01-01
  • 2015-04-27
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
相关资源
最近更新 更多