2016-02-27 3 views
0

Я пытаюсь вызвать WebAPI с самонастраиваемым ceritficate. Я выводил ATS, насколько я могу, действуя следующий мое info.plist:Как вызвать вызов WebAPI, который имеет самонастраиваемую аутентификацию в swift

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
</dict> 

Однако, даже после добавления этого кода я все еще получаю ту же ошибку. Код и ошибка приведены ниже. Любая помощь будет оценена.

let postEndpoint: String = "https://api.rimorton.com/com.absolute.am.webapi/api/login" 
    let url = NSURL(string: postEndpoint) 
    let urlRequest = NSURLRequest(URL: url!) 
    let config = NSURLSessionConfiguration.defaultSessionConfiguration() 
    let session = NSURLSession(configuration: config) 

    let task = session.dataTaskWithRequest(urlRequest, completionHandler: { 
     (data, response, error) in 

     guard error == nil else { 
      print("error calling GET on /posts/1") 
      print(error) 
      return 
     } 

     guard let responseData = data else { 
      print("Error: did not receive data") 
      return 
     } 

     // parse the result as JSON, since that's what the API provides 
     let post: NSDictionary 
     do { 
      post = try NSJSONSerialization.JSONObjectWithData(responseData, 
       options: []) as! NSDictionary 
     } catch { 
      print("error trying to convert data to JSON") 
      return 
     } 
     // now we have the post, let's just print it to prove we can access it 
     print("The post is: " + post.description) 

     // the post object is a dictionary 
     // so we just access the title using the "title" key 
     // so check for a title and print it if we have one 
     if let postTitle = post["title"] as? String { 
      print("The title is: " + postTitle) 
     } 
    }) 
    task.resume() 

Ошибка: 2016-02-28 19: 40: 03,521 LANrevTarget_Dev [19173: 878737] NSURLSession/NSURLConnection HTTP загрузка не удалась (kCFStreamErrorDomainSSL, -9813) ошибка при вызове GET на/сообщений/1 Дополнительно (Error Domain = NSURLErrorDomain Code = -1202 «Сертификат для этого сервера недействителен. Возможно, вы подключаетесь к серверу, который притворяется« api.rimorton.com », который может поставить вашу конфиденциальную информацию под угрозу». UserInfo = {NSURLErrorFailingURLPeerTrustErrorKey =, NSLocalizedRecoverySuggestion = Хотелось бы подключиться к серверу в любом случае ?, _kCFStreamErrorDomainKey = 3, _kCFStreamErrorCodeKey = -9813, NSErrorPeerCertificateChainKey = {type = immutable, count = 1, values ​​= ( 0: )}, NSUnderlyingError = 0x7fb78b542e00 {Ошибка домена = kCFErrorDomainCFNetwork код = -1202 "(нуль)" UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0, = kCFStreamPropertySSLPeerTrust, _kCFNetworkCFStreamSSLErrorOriginalValue = -9813, _kCFStreamErrorDomainKey = 3, _kCFStreamErrorCodeKey = -9813, kCFStreamPropertySSLPeerCertificates = {type = immutable, count = 1, values ​​= ( 0: )}}}, NSLocalizedDescription = Сертификат для этого сервера недействителен. Возможно, Вы подключаетесь к серверу, который притворяется «api.rimorton.com», который может поставить вашу конфиденциальную информацию в опасности., NSErrorFailingURLKey = https://api.rimorton.com/com.absolute.am.webapi/api/login, NSErrorFailingURLStringKey = https://api.rimorton.com/com.absolute.am.webapi/api/login, NSErrorClientCertificateStateKey = 0})

ответ

0

Разрешение произвольных нагрузок Безразлично Отключить проверку сертификата. Он просто разрешает нешифрованные HTTP-запросы, а также запросы, в которых сертификат имеет тип, который не считается достаточно безопасным (например, без секретности).

Чтобы разрешить конкретный самозаверенный ключ, прочитать:

https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/OverridingSSLChainValidationCorrectly.html

примеры все Objective-C, но они должны дать вам основную идею. В частности, вам понадобится функция addAnchorToTrust.

Тогда взгляните на connection:willSendRequestForAuthenticationChallenge:challenge на этой странице, и делают в основном одно и то же в методе URLSession:didReceiveChallenge:completionHandler:, за исключением того, что везде это:

[challenge.sender useCredential:credential forAuthenticationChallenge:challenge]; 

вы вместо того, чтобы позвонить:

completionHandler(NSURLSessionAuthChallengeUseCredential, credential); 

и везде, где он называет

[connection cancel] 

вас вместо этого звоните

completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); 

Надеюсь, что это поможет.Кроме того, вам нужно сохранить копию доверенного CERT в вашем приложении расслоении и читать его в ваше приложение, как описано здесь:

How can I get SecKeyRef from DER/PEM file

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

  • Нет связанных вопросов^_^