iosswiftsslalamofire

SSL Certificate Pinning with Alamofire not working in iOS


I have tried implementing ssl pinning with certificate using alamofire in swift project but I am getting noCertificateFound error.

let evaluator : [String : ServerTrustEvaluating] = ["staging-clientsapi.expatpa.com": PinnedCertificatesTrustEvaluator(certificates: AFWrapper.pinnedCertificates())]
let manager = ServerTrustManager(evaluators: evaluator)
afSession = Session.init(serverTrustManager: manager)
    static func pinnedCertificates() -> [SecCertificate] {
        var certificates: [SecCertificate] = []
        if let pinnedCertificateURL = Bundle.main.url(forResource: "expatpa.com", withExtension: "cer") {
            do {
                let pinnedCertificateData: CFData = try Data(contentsOf: pinnedCertificateURL) as CFData
                if let pinnedCertificate: SecCertificate = SecCertificateCreateWithData(nil, pinnedCertificateData) {
                    certificates.append(pinnedCertificate)
                }
            } catch {
                print("certicate exception--")
            }
        }
        return certificates
    }

    afSession.request(request).validate().responseString { .... }

Solution

  • .noCertificatesFound means your Bundle.main.url(forResource: "expatpa.com", withExtension: "cer") returned nothing and passed an empty array to the evaluator. I suggest you just use Alamofire's default .pinnedCertificates evaluator, which will find all certificates in the main bundle by default.