2016-11-23 3 views
3

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

При использовании веб-службы я получаю сообщение об ошибке «certificate is Invalid».

FAILURE: «, которые могли бы поставить вашу конфиденциальную информацию в опасности„Error 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 и номер порта, я создал запись хоста в моей и т.д./файл хостов для IP веб-сервера и потребляющих его как https://devportal:8443/rest/login вместо того, чтобы потреблять его как https://192.22.xx.xxx:8443/rest/login

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

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

+0

Является ли ваше тестовое устройство настроенным на доверие самозаверяющему сертификату? Это можно проверить в настройках iOS -> Общие -> Профили. –

+0

@Rein Я не тестирую его на устройстве в этот момент, так как он не готов к тестированию. Я только что начал разработку и запускал ее на симуляторе. – CrazyDeveloper

ответ

3

Я изменил свой код, как показано ниже, и это сработало. Я указал Swift: How to Make Https Request Using Server SSL Certificate на устранение этой проблемы.

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

        // Create the server trust policies 
        let serverTrustPolicies: [String: ServerTrustPolicy] = [ 

         "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){ 

    // Handle Authentication challenge 

      let delegate: Alamofire.SessionDelegate = LoginService.Manager.delegate 
     delegate.sessionDidReceiveChallenge = { session, challenge in 
       var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling 
       var credential: URLCredential? 
       if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust { 
        disposition = URLSession.AuthChallengeDisposition.useCredential 
        credential = URLCredential(trust: challenge.protectionSpace.serverTrust!) 
       } else { 
        if challenge.previousFailureCount > 0 { 
         disposition = .cancelAuthenticationChallenge 
        } else { 
         credential = LoginService.Manager.session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace) 
         if credential != nil { 
          disposition = .useCredential 
         } 
        } 
       } 
       return (disposition, credential) 
     } 

//Web service Request  
        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)") 
         } 
        } 



      } 
     } 

Вы также должны настроить 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> 

Не вводите IP или номера портов в ваших NSExceptiondomains. Это не будет работы. Если вы пытаетесь подключиться к веб-серверу с IP-адресом, карту IP-адрес домена, добавив запись хоста в т.д./Hosts файл в макинтош, а затем использовать имя домена в NSExceptionDomains

ВАЖНО : Не используйте этот код в процессе производства, так как это ставит ваших пользователей информацию под угрозу, минуя вызов auth.

+0

Большое спасибо за меня :-) –

Смежные вопросы