Swift使用HTTPS
关于iOS中使用HTTPS这件事情,很长时间一直没有彻底弄清楚。看了别人很多文章,今天终于基本都搞清楚了所有疑问,这里抽关键点来讲一讲。以回答问题的方式。 1. HTTPS到底是个什么鬼?SSL+HTTP HTTPS主要目的是保证传输通道的安全性 综上,所以中间人就无法修改通信数据。 2. 证书又是个什么鬼?
3. 证书认证机构(CA)签发的证书怎么用?此类证书,iOS端开发什么都不用处理,获取并校验证书的过程底层已经帮忙完成了,具体是SSL层还是苹果的ATS做的我也没有彻底弄清楚(估计应该是ATS做的,如果你知道,请赐教!) 4. 自签证书怎么用?自签名的证书iOS9.0之后的系统通过不了ATS,所以要做一些适配: 具体代理方法: 具体代码: ```swift /** a delegate method to check whether the remote cartification is the same with given certification. - parameter session: NSURLSession - parameter challenge: NSURLAuthenticationChallenge - parameter completionHandler: the completionHandler closure */ @objc(URLSession:didReceiveChallenge:completionHandler:) func urlSession(_ session: URLSession,completionHandler: @escaping (URLSession.AuthChallengeDisposition,URLCredential?) -> Void) { if let localCertificateData = self.localCertData { if let serverTrust = challenge.protectionSpace.serverTrust,let certificate = SecTrustGetCertificateAtIndex(serverTrust,0) { let remoteCertificateData: Data = SecCertificateCopyData(certificate) as Data // 证书校验:这里直接比较本地证书文件内容 和 服务器返回的证书文件内容 if localCertificateData as Data == remoteCertificateData { let credential = URLCredential(trust: serverTrust) challenge.sender?.use(credential,for: challenge) // 证书校验通过 completionHandler(Foundation.URLSession.AuthChallengeDisposition.useCredential,credential) } else { challenge.sender?.cancel(challenge) // 证书校验不通过 completionHandler(Foundation.URLSession.AuthChallengeDisposition.cancelAuthenticationChallenge,nil) self.sSLValidateErrorCallBack?() } } else { // could not tested print("Pitaya: Get RemoteCertificateData or LocalCertificateData error!") } } else { completionHandler(Foundation.URLSession.AuthChallengeDisposition.useCredential,nil) } }
使用第三方框架,过程是一样的,只是框架加了一层自己的方法,暴露出来的方法不一样而已。 5. 补充iOS对证书是有要求的:
6. 参考Swift - 使用URLSession通过HTTPS进行网络请求,及证书的使用 我的简书地址 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |