2017-03-21 5 views
1

Ich verwende Swift 3 und einen Web-Service zum ersten Mal zu treffen. Mein Web-Service läuft über HTTPS und ich möchte mit Verschlüsselung an Ort und Stelle testen.Zertifikat für diesen Server ist ungültig für selbstsigniertes Cert auf swift 3

Hier ist mein Code so weit:

let config = URLSessionConfiguration.default // Session Configuration 
    let session = URLSession(configuration: config) // Load configuration into Session 
    let url = URL(string: webService.getLoginUrl())! 

    let task = session.dataTask(with: url, completionHandler: { 
     (data, response, error) in 

     if error == nil { 
      do { 
       if let json = 
        try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]{ 
        //Implement your logic 
        print(json) 
       } 
      } catch { 
       print("error in JSONSerialization") 
      } 
     } else { 
      print(error!.localizedDescription) 
     } 

    }) 
    task.resume() 

Als ich dies gegen meinen Testserver laufen, die selbst signiertes ist, erhalte ich:

The certificate for this server is invalid. You might be connecting to a server that is pretending to be “10.0.0.51” which could put your confidential information at risk. 

Also, was ich tun möchte akzeptiert alle Zertifikate beim Testen, aber nicht in der Produktion.

http://www.byteblocks.com/Post/Use-self-signed-SSL-certificate-in-iOS-application https://github.com/socketio/socket.io-client-swift/issues/326

aber diese scheinen predate swift 3.

Wie löse ich dieses Problem:

Ich habe ein paar Websites, wie gefunden?

Antwort

2

Nach viel Forschung, habe ich gelernt, wie die Delegierten arbeiten mit URLSession Objekte in swift 3. Zu viele Stücke einen Link zu posten, aber am Ende, dies war das hilfreich: https://gist.github.com/stinger/420107a71a02995c312036eb7919e9f9

Also, das zu beheben Problem, erbte ich meine Klasse von URLSessionDelegate und dann hinzugefügt, um die folgende Funktion:

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 

    //accept all certs when testing, perform default handling otherwise 
    if webService.isTesting() { 
     print("Accepting cert as always") 
     completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!)) 
    } 
    else { 
     print("Using default handling") 
     completionHandler(.performDefaultHandling, URLCredential(trust: challenge.protectionSpace.serverTrust!)) 
    } 
} 

die isTesting() -Aufruf bestimmt, ob ich den Test-Server bin mit, und dann nehmen wir alle Zertifikate, wenn wir im Testmodus sind .

+0

Was ist WebService? – Kingalione

Verwandte Themen