Как добавить закрепление SSL-сертификата в приложении ios swift4 с помощью менеджера alamofire? - PullRequest
0 голосов
/ 24 февраля 2019

У меня проблема с закреплением сертификата ssl в моем приложении ios, я хочу добавить сертификат закрепления ssl ко всем запросам, используя alamofire, поэтому ниже приведен мой код менеджера alamofire, когда я запускаю приложение, я всегда получаю эту ошибку:

загрузка не удалась с ошибкой. Ошибка Domain = NSURLErrorDomain Code = -999 "отменен" UserInfo = {NSErrorFailingURLStringKey = https://myWebsite.com/token, NSErrorFailingURLKey = https://myWebsite.com/token, _NSURLErrorRelatedURRessionTask ().1> "), _NSURLErrorFailingURLSessionTaskErrorKey = LocalDataTask. <1>, NSLocalizedDescription = отменено} [-999]

class AFManager : NSObject{

private var sessionManager: SessionManager?


required override init() {
    super.init()

    enableCertificatePinning()

}

private func enableCertificatePinning() {
    let certificates = getCertificates()
    let trustPolicy = ServerTrustPolicy.pinCertificates(
        certificates: certificates,
        validateCertificateChain: true,
        validateHost: true)
    let trustPolicies = [ "myWebsite.com": trustPolicy ]
    let policyManager =  ServerTrustPolicyManager(policies: trustPolicies)
    sessionManager = SessionManager(
        configuration: .default,
        serverTrustPolicyManager: policyManager)
}

private func getCertificates() -> [SecCertificate] {
    let url = Bundle.main.url(forResource: "myWebsitessl", withExtension: "cer")!
    let localCertificate = try! Data(contentsOf: url) as CFData
    guard let certificate = SecCertificateCreateWithData(nil, localCertificate)
        else { return [] }

    return [certificate]
}



///without headers (post)
//used this to registration
class func requestPOSTURL(_ strURL : String, params : [String : AnyObject]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void){
    URLCache.shared.removeAllCachedResponses()
    self.init().sessionManager?.request(strURL, method: .post, parameters: params, encoding: URLEncoding.httpBody).responseJSON { (responseObject) -> Void in

        //print(responseObject)

        if responseObject.result.isSuccess {
            let resJson = JSON(responseObject.result.value!)
            success(resJson)
        }
        if responseObject.result.isFailure {
            let error : Error = responseObject.result.error!
            failure(error)
        }
    }
}


///// response string (post)
//used this in login // used in change password
class func strRequestPOSTURL(_ strURL : String, params : [String : String]?, headers : [String : String]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void){
    URLCache.shared.removeAllCachedResponses()
    self.init().sessionManager?.request(strURL, method: .post, parameters: params, encoding: URLEncoding.httpBody, headers: headers).responseJSON { (response) in
        //print(response)

        if response.result.isSuccess {
            let resJson = JSON(response.result.value!)
            success(resJson)
        }
        if response.result.isFailure {
            let error : Error = response.result.error!

            failure(error)
        }

    }

  }

}

Мой код был таким, см. Код ниже, и он работал, но яхочу закрепление сертификата для безопасности, поэтому я добавляю вещи (например, sessionManager, init (), enableCertificatePinning () и getCertificates ()) в приведенный выше код, и после этого он не работает

class AFManager : NSObject{


///without headers (post)
//used this to registration
class func requestPOSTURL(_ strURL : String, params : [String : AnyObject]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void){
    URLCache.shared.removeAllCachedResponses()
    Alamofire.request(strURL, method: .post, parameters: params, encoding: URLEncoding.httpBody).responseJSON { (responseObject) -> Void in

        //print(responseObject)

        if responseObject.result.isSuccess {
            let resJson = JSON(responseObject.result.value!)
            success(resJson)
        }
        if responseObject.result.isFailure {
            let error : Error = responseObject.result.error!
            failure(error)
        }
    }
}


///// response string (post)
//used this in login // used in change password
class func strRequestPOSTURL(_ strURL : String, params : [String : String]?, headers : [String : String]?, success:@escaping (JSON) -> Void, failure:@escaping (Error) -> Void){
    URLCache.shared.removeAllCachedResponses()
    Alamofire.request(strURL, method: .post, parameters: params, encoding: URLEncoding.httpBody, headers: headers).responseJSON { (response) in
        //print(response)

        if response.result.isSuccess {
            let resJson = JSON(response.result.value!)
            success(resJson)
        }
        if response.result.isFailure {
            let error : Error = response.result.error!

            failure(error)
        }

    }

  }

}

Я добавил сертификат вперетащите мой проект внутрь проекта, пожалуйста, помогите, я чувствую, что в моем коде есть ошибки спасибос заранее

1 Ответ

0 голосов
/ 25 февраля 2019

Ошибка -999 чаще всего наблюдается, когда ваш SessionManager равен deinit 'd во время использования, в результате чего все ваши запросы будут отменены.Судя по вашему коду, вы вообще не используете переменную sessionManager, которую создали с помощью пользовательского ServerTrustPolicy, и даже если бы вы были, вполне вероятно, что любой созданный вами экземпляр AFManager выйдет изсфера, в результате чего deinit.

...