Ошибка сертификата с Alamofire 4.0

Я пытаюсь использовать веб-сервисы для моего приложения для iOS через https. Веб-сервер использует самозаверяющий сертификат.

При использовании веб-службы я получаю сообщение об ошибке «Сертификат недействителен».

Сбой: Ошибка Domain = NSURLErrorDomain Code = -1202 «Сертификат для этого сервера недействителен. Возможно, вы подключаетесь к серверу, который притворяется« порталом », который может подвергнуть риску вашу конфиденциальную информацию».

Я знаю, что лучше всего исправить это на стороне сервера, чтобы включить доверенный корневой центр сертификации. Но поскольку это временная среда разработки, мы используем самозаверяющий сертификат. Так как это проблема ATS, я отредактировал ATS в моем info.plist, как показано ниже.

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>devportal</key>
        <dict>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
</dict>
</plist>

Поскольку домены NSException не работают с IP-адресом и номером порта, я создал запись хоста в моем файле etc / hosts для IP-адреса веб-сервера и использую его какhttps: // devportal: 8443 / отдых / Логин вместо того, чтобы потреблять его какhttps://192.22.xx.xxx:8443/rest/login

Я следовал документации alamofire по политикам доверия сервера, редактировал ATS, чтобы разрешить домены исключений, но у меня ничего не получалось. Я потратил более 3 дней на эту проблему. Я что-то пропустил? Кто-нибудь сталкивался с подобной проблемой? Есть ли решение для этого? заранее спасибо

Я использую almofire 4.0, Xcode 8.0. Ниже мой код.

class LoginService{
     private static var Manager: Alamofire.SessionManager = {

          let pathToCert = Bundle.main.path(forResource: "192.22.xx.xxx", ofType: "crt") // Downloaded this certificate and have added to my bundle
          let localCertificate:NSData = NSData(contentsOfFile: pathToCert!)!

          // Create the server trust policies
          let serverTrustPolicies: [String: ServerTrustPolicy] = [
               "192.22.xx.xxx": .pinCertificates(
                    certificates: [SecCertificateCreateWithData(nil, localCertificate)!],
                    validateCertificateChain: true,
                    validateHost: true
               ),

               "devportal:8443": .disableEvaluation
          ]

          // Create custom manager
          let configuration = URLSessionConfiguration.default
          configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
          let manager = Alamofire.SessionManager(
               configuration: URLSessionConfiguration.default,
               serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
          )

          return manager
     }()



     /**
      Calls the Login Web Service to authenticate the user
      */
     public func login(username:String, password: String){

          let parameters = [
               "username": "TEST",
               "password": "PASSWORD",
                  ]
          let header: HTTPHeaders = ["Accept": "application/json"]
          LoginService.Manager.request("https://devportal:8443/rest/login", method: .post, parameters: parameters, encoding: JSONEncoding(options: []),headers :header).responseJSON { response in
               debugPrint(response)

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



     }
}

Ответы на вопрос(1)

Ваш ответ на вопрос