• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 00:19:08 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用 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

但这些似乎早于 swift 3。

我该如何解决这个问题?



Best Answer-推荐答案


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

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

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

关于ios - 此服务器的证书对于 swift 3 上的自签名证书无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42939099/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap