Blog スタッフブログ

iOS Swift システム開発

[Swift]Alamofire5で期限の切れたSSL証明書を無視する

Swift

こんにちは、株式会社MIXシステム開発担当のBloomです。

早速本題のAlamofire5で期限の切れたSSL証明書を無視する手順について、

お仕事の中で得た知見を共有させていただきたいと思います。

この記事は開発環境などで動作確認のため、一時的にSSLを無視したい場合の対処法となります。リリース時には特別な意図がない限りSSL証明書の検証を行なってください。

Alamofire5について

以前の記事ではAlamofire4を利用していましたが今回はAlamofire5の利用となり、一部構文が変化しています。

リンク先の記事の構文をAlamofire5で書き換えるとこのようになります。

    func callStringArrayApi() {
        let url = URL(string: apiUrl + "/api/example")!
        AF.request(url,
                   method: .get,
                   parameters: nil,
                   encoding: JSONEncoding.default)
        .responseDecodable(of: [String].self, decoder: JSONDecoder()) { response in
            switch response.result {
            case .success:
                if let arr = response.value {
                    print("string array decoded: \(arr)")
                } else {
                    print("string array decoding failed")
                }
            case .failure(let error):
                print(error)
            }
        }
    }

これを踏まえてSSL証明書を検証しない形式のコードを記載します。

SSL証明書を検証しないリクエスト

class APIConnection: NSObject {
    static let shared = APIConnection()
    private override init(){
        super.init()
    }

    var apiUrl: String {
        return "https://example.com"
    }

    private let session: Session = {
        let manager = ServerTrustManager(evaluators: ["example.com": DisabledTrustEvaluator()])
        let configuration = URLSessionConfiguration.af.default
        return Session(configuration: configuration, serverTrustManager: manager)
    }()
    
    func callApi(handler:@escaping (Data?) -> Void) {
        let url = URL(string: apiUrl + "/api/example")!
        session.request(url,
                        method: .get,
                        encoding: URLEncoding.default).responseData { response in
            handler(response.data)
        }
    }
}

Alamofireで利用するSessionをクラス内で保持し、ServerTrustManagerの初期化時にドメインに対してDisabledTrustEvaluatorを指定しています。

これに加えて[Signing & Capabilities] -> [App Transport Security Exception]から対象ドメインをException Domainsに指定しておきましょう。

これで開発環境のSSL証明書が古い場合でも一旦動作確認ができるようになりました。良かったですね。