美文网首页
HTTPS概述及项目配置

HTTPS概述及项目配置

作者: 五月飞 | 来源:发表于2016-11-25 15:31 被阅读40次

    阅读完本节你将了解到:

    • 什么是服务器信任证书?
    • 什么情况下证书是p12格式或者是cer格式的,都是属于公钥吗?
    • HTTPS认证是公钥还是秘钥?

    公钥和私钥解读

    客户端向服务器发送消息

    1. 客户端向服务器发送请求的时候,使用公钥对发送的内容进行加密,就可以达到保密的效果.
    2. 服务器在收到客户端发送过来内容时,使用私钥对内容解密得到明文数据

    服务器向客户端返回消息

    1. 服务器将要发送的内容使用hash函数成摘要,再使用私钥加密摘要生成一个"数字签名",然后连同内容一起发给客户端
    2. 客户端使用公钥对数字签名进行解密生成摘要,然后对内容使用hash函数生成另一个摘要,比较两个摘要是否相同,来确认内容是否被篡改过

    流程参考:[http://www.cnblogs.com/shijingjing07/p/5965792.html]

    以上过程仅完成了服务器认证(客户端知道服务器是真的,服务器不知道客户端是不是真的).这种方式不需要在Bundle中引入CA文件,可以交给系统去判断服务器端的证书是不是SSL证书,验证过程也不需要我们去具体实现。

    概念

    数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机 构的公章)后形成的一个数字文件。CA完成签发证书后,会将证书发布在CA的证书库(目录服务器)中,任何人都可以查询和下载,因此数字证书和公钥一样是公开的。实际上,数字证书就是经过CA认证过的公钥

    TLS/SSL中使用了非对称加密,对称加密以及HASH算法

    项目实践

    在swift2.x项目中添加
    项目中的网络框架使用的是Alamofire,只有一种认证服务器端的证书,后台给的是.crt格式的需要用钥匙串导出来.cer格式,然后将这个文件添加到项目中,之后开始写配置方法

        ///授权服务器认证
        func authServerTrust(){
            let manager = Alamofire.Manager.sharedInstance
            manager.delegate.sessionDidReceiveChallenge = { session, challenge in
            
                //认证服务器证书
                if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
    //                print("服务器证书认证")
                    let serverTrust:SecTrust = challenge.protectionSpace.serverTrust!
                    let certificate = SecTrustGetCertificateAtIndex(serverTrust, 0)!
                    let remoteCertificateData = CFBridgingRetain(SecCertificateCopyData(certificate))!
                    let cerPath = NSBundle.mainBundle().pathForResource("xxxx.com", ofType: "cer")!
                    let cerUrl = NSURL.init(fileURLWithPath: cerPath)
                    let localCertificateData = NSData(contentsOfURL: cerUrl)
                    
                    if remoteCertificateData.isEqual(localCertificateData) == true {
                        let credential = NSURLCredential.init(trust: serverTrust)
                        challenge.sender?.useCredential(credential, forAuthenticationChallenge: challenge)
                        
                        
                        let serverTrust = NSURLCredential.init(trust: challenge.protectionSpace.serverTrust!)
                        return (.UseCredential,serverTrust)
                    }else{
                        return (.CancelAuthenticationChallenge,nil)
                    }
                }else{
                    return (.CancelAuthenticationChallenge,nil)
                }
                
            }
        }
    
    

    方法执行一次就行,不需要每次发起网络请求都调用此方法

    相关文章

      网友评论

          本文标题:HTTPS概述及项目配置

          本文链接:https://www.haomeiwen.com/subject/hkfwpttx.html