13

HTTPS Web サービスにアクセスする iPad アプリを作成しています。ピン留めを実装したいのですが、問題があります。

このクラスは Alamofire Manager を作成します (主にドキュメントから取得)。

class NetworkManager {

    var manager: Manager?

    init() {
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            "www.google.co.uk": .PinCertificates(
                certificates: ServerTrustPolicy.certificatesInBundle(),
                validateCertificateChain: true,
                validateHost: true
            ),
            "insecure.expired-apis.com": .DisableEvaluation
        ]

        manager = Alamofire.Manager(
            configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
            serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
        )
    }
}

この関数は呼び出しを行います:

static let networkManager = NetworkManager()

public static func testPinning() {
    networkManager.manager!.request(.GET, "https://www.google.co.uk").response { response in
        if response.1 != nil {
            print("Success")
            print(response.1)
            print(response.1?.statusCode)
        } else {
            print("Error")
            print(response.3)
        }
    }
}

証明書はプロジェクトに保存され、 [ターゲット] > [ビルド フェーズ] > [バンドル リソースのコピー] の下に表示されます。

現在、(のelseブロックから)リクエストを行うたびに次のエラーが表示されますtestPinning():

Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLKey=https://www.google.co.uk/, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://www.google.co.uk/})
4

3 に答える 3

1

Alamofire バージョン +5 の後、大きな変更がありました。証明書のピン留めを行うために行ったことをここにリストします。私は Moya をターゲットにしていましたが、Alamofire の上のレイヤーとして Moya を使用しているため、Alamofire で機能するものは Moya でも機能するはずです。

最初にサーバー証明書を取得するには、ブラウザで開き、鍵のアイコンをクリックする必要があります。次に、スクリーンショットが示すように、証明書をクリックする必要があります。 ここに画像の説明を入力 その後、この証明書をデスクトップにドラッグするか、以下のスクリーンショットを見てダウンロードする必要があります。 ここに画像の説明を入力 次に、Xcode チェック スクリーンショットで add file を使用してプロジェクトに追加する必要があります。 ここに画像の説明を入力 Alamofireのコードは次のとおりです。

var session: Session!

class ViewController: UIViewController {

func testPinning() {


let evaluators: [String: ServerTrustEvaluating] = [
    "stackoverflow.com": PublicKeysTrustEvaluator()
]

let manager = ServerTrustManager(evaluators: evaluators)

session = Session(serverTrustManager: manager)


session
    .request("https://stackoverflow.com/questions/34611112/certificate-pinning-in-alamofire/55902588#55902588", method: .get)
    .validate()
    .response(completionHandler: { [weak self] response in
        switch response.result {
        case .success:
            print(response.data)
        case .failure(let error):
            switch error {
            case .serverTrustEvaluationFailed(let reason):
                // The reason here is a place where you might fine-tune your
                // error handling and possibly deduce if it's an actualy MITM
                // or just another error, like certificate issue.
                //
                // In this case, this will show `noRequiredEvaluator` if you try
                // testing against a domain not in the evaluators list which is
                // the closest I'm willing to setting up a MITM. In production,
                // it will most likely be one of the other evaluation errors.
                print(reason)
            default:
                print("default")
            }
        }
    })

}

Moya の場合、そのセッションを moya プロバイダーに追加する必要があります。

let evaluators: [String: ServerTrustEvaluating] = [
    "stackoverflow.com": PublicKeysTrustEvaluator()
]

let manager = ServerTrustManager(evaluators: evaluators)

session = Session(serverTrustManager: manager)


let provider = MoyaProvider<YourStackOVerflowProvider>(
    session: session
)


provider.request(.pluginManger) { response in
    switch response {
    case .failure(let err):
        print(err)
    case .success(let response):
        print(response)
    }
}
于 2021-05-30T08:48:35.910 に答える