对于swift 3上的自签名证书,此服务器的证书无效 [英] Certificate for this server is invalid for self signed cert on swift 3

查看:314
本文介绍了对于swift 3上的自签名证书,此服务器的证书无效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using swift 3 and hitting a web service for the first time. My web service runs over HTTPS and I want to test with encryption in place.

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

Here's my code so far:

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

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

When I run this against my test server, which is self-signed, I get:

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.

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

So what I'd like to do is accept all certificates when testing, but not in production.

我发现了几个网站:

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:// g ist.github.com/stinger/420107a71a02995c312036eb7919e9f9

After much research, I learned about how delegates work with URLSession objects in swift 3. Too many pieces to post a link, but in the end, this was the most helpful: https://gist.github.com/stinger/420107a71a02995c312036eb7919e9f9

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

So, to fix the problem, I inherited my class from URLSessionDelegate and then added the following function:

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()调用确定我是否正在使用测试服务器,然后如果我们处于测试模式,则接受所有证书。

The isTesting() call determines if I'm using the test server, and then we accept all certificates if we're in testing mode.

这篇关于对于swift 3上的自签名证书,此服务器的证书无效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆