对于swift 3上的自签名证书,此服务器的证书无效

我正在使用swift 3并首次点击Web服务。 我的Web服务通过HTTPS运行,我希望使用加密进行测试。

到目前为止,这是我的代码:

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() 

当我对我自己签名的测试服务器运行时,我得到:

 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. 

所以我想做的是在测试时接受所有证书,但不在生产中。

我发现了几个网站:

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

但这些似乎早于3。

我该如何解决这个问题?

经过大量的研究,我了解了代理如何使用swift 3中的URLSession对象。发布链接太多了,但最后,这是最有帮助的: https : //gist.github.com/stinger/420107a71a02995c312036eb7919e9f9

因此,为了解决这个问题,我从URLSessionDelegateinheritance了我的类,然后添加了以下函数:

 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!)) } } 

isTesting()调用确定我是否正在使用测试服务器,然后如果我们处于测试模式,我们接受所有证书。