Swift client and root SSL certificate authentication

喜夏-厌秋 提交于 2019-12-04 18:17:00

Create CustomServerTrustPolicyManager.swift and use below code

import UIKit
import Alamofire

class CustomServerTrustPolicyManager: ServerTrustPolicyManager {

    override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? {
        // Check if we have a policy already defined, otherwise just kill the connection
        if let policy = super.serverTrustPolicy(forHost: host) {
            return policy
        } else {
            return .customEvaluation({ (_, _) -> Bool in
                return false
            })
        }
    }
}

then create NetworkManager.swift and use below code:

import UIKit
import Alamofire

class NetworkManager {

    static let sharedInstance = NetworkManager()

    let manager: Alamofire.SessionManager = {

        //For using Cerificates Pinning
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            "host_url": .pinCertificates(
            certificates: ServerTrustPolicy.certificates(),
                validateCertificateChain: true,
                validateHost: true
            )
        ]

        /*
        //For Using with Public Key
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            "host_url": .pinPublicKeys(
                publicKeys: ServerTrustPolicy.publicKeys(),
                validateCertificateChain: true,
                validateHost: true
            )
        ]
        */

        let configuration = URLSessionConfiguration.default
        configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders

        return Alamofire.SessionManager(
            configuration: configuration,
            serverTrustPolicyManager: CustomServerTrustPolicyManager(policies: serverTrustPolicies)
        )
    }()
}

After that use like following to test your connection.

func testSSLConnection() {
    NetworkManager.sharedInstance.manager.request("your_url_to_test").responseJSON { response in
        print("Request: \(String(describing: response.request))")   // original url request
        print("Response: \(String(describing: response.response))") // http url response
        print("Result: \(response.result)")                         // response serialization result

        if let json = response.result.value {
            print("JSON: \(json)") // serialized json response
        }
    }
}

Hope it will help you.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!