web-dev-qa-db-ja.com

SSL_ERROR_SSL(1):ライブラリ内で操作に失敗しました

いくつかのSSL Errors(リクエストを待っているDispatchGroupがあるので、プロジェクトがクラッシュせずに停止/ハングする原因となっています)を取得しています。または、それについてどうするか。

私はこの問題について多数のページを大まかに読みましたが、ドキュメントや同じ問題を抱えている人はあまりいません。 info.plistを変更する を試しましたが、それは役に立たなかったようです。両方のplistは次のようになります:(accounts.spotify.comはアクセストークンリクエストのURLのドメインです)

enter image description here

サーバーにリクエストを送信すると、コードが失敗することがわかります。 (これは私のフレームワークにあります)。前に述べたように、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:error:100000d7:SSL routines:OPENSSL_internal:SSL_HANDSHAKE_FAILURE:/ BuildRoot /ライブラリ/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 routines:OPENSSL_internal:SSL_HANDSHAKE_FAILURE:/ BuildRoot /ライブラリ/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 routines:OPENSSL_internal:SSL_HANDSHAKE_FAILURE:/ BuildRoot /ライブラリ/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:error:100000d7:SSL routines:OPENSSL_internal:SSL_HANDSHAKE_FAILURE:/ BuildRoot /ライブラリ/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 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.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 Read Status [2:0x0]:1:57

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

enter image description here

これはSpotifyを介したAlamofireリクエストに対するもので、以前は機能していましたが、現在は不可解です。私のデバイスまたはシミュレーターでは機能しません。

これは安全なインターネット接続に関連する問題ですか?それとも別の問題ですか?

私が見たものへのいくつかのリンク:

編集:

これはSpotifyのサーバーの問題ですか?またはXcode 10のバグですか?フレームワーク.Swiftファイルをプロジェクトに移動し、それでもログを取得しました。

私はリクエストの前にこれらのエラーも受け取ります。

これはハンドシェイクエラーとは何かですが、私はこれを設定しません:

SSLハンドシェイクは、ブラウザーがWebサーバーへの安全な接続要求を発行すると開始されます。サーバーはコンピューターに公開鍵を送信し、コンピューターは認証局の既知のリストに対して証明書をチェックします。 ...ハンドシェイクを意図的に失敗させることにより、SSL機能をテストします。

gitを使用してすべての変更を元に戻すために以前のバージョンでチェックアウトを試みました(以前のバージョンでは完全に正常に機能していました)。


編集:一時的な解決策:

IOS 12はこれらのネットワークリクエストで動作しなくなったように見えます。 2日前にバグレポートをAppleに送信したので、すぐに修正されることを期待しています。それで私は何をしましたか?

さて、今のところ、私のiPhone 7はiOS 12ベータ版なので役に立たない。したがって、現時点での唯一のオプションは、シミュレータでプロジェクトを実行することです。これを行うには(シミュレーターがiOS 12であるためXcode 10ベータ版のように)、Xcode -> Preferences -> Components -> iOS 11.4 Simulatorに移動してダウンロードします。ここで、シミュレータを選択するときに、iOS 11.4と言うものを選択します。

  • この部分はもはや真実ではありません。

これは何が原因ですか?

このエラーは何の影響もありませんが、プロジェクトをiOS 12で実行したときに発生します。私が知る限り、これはセキュリティの問題ではありません。ただし、コードが実行されないという私の問題は、このエラーが原因だと思っていたのではなく、デッドロックが原因でした。

更新:バグレポートについてAppleが行ったこと

さて、Appleからメッセージや何かを受け取ったわけではありませんが、レポートは「重複」としてマークされています。いつ修正されるかについての情報があれば、ここで更新します。


質問、ヒント、またはポインタがある場合は、お知らせください!事前に感謝します!

45
George_E

デッドロック

メインスレッドで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

スクリーンショットを参照してください: console output

info.plistのATS設定

Spotifyは、サーバー上で有効なTLS証明書チェーンを提供します。したがって、info.plistでATS設定を行う必要はありません。

コンソールのSSL警告

あなたのようなiOS 12シミュレータでアプリケーションを実行すると、コンソールに同じSSL警告が表示されます。それにもかかわらず、接続が確立され、リクエストがデータを配信します。おそらく、これは次のベータ版の1つでなくなっています。

15

どの応答呼び出しでも、エミュレータのcodegen Swaggerで同じ警告が表示されました。しかし、すべてが働いた。この警告は、環境変数を追加したときにのみ消えました 奇妙な不要なXcodeログを非表示にする

0
Zhebzhik Babich