1.https介绍
https是运行在 TLS/SSL之上的http,与http醒目就是在数据传输的安全性问题上做了提高,其实原理也很简单,就是所谓的 对称加密 和 非对称加密
01. 对称加密只有一个密钥,加密和解密都用这个密钥
02.非对称加密有公钥和私钥,私钥加密后的内容只有公钥才能解密,公钥加密的内容只有私钥才能解密。
为了提高安全性,通常的做法是使用对称加密的方法进行加密,但是对称加密也有问题,双方通信的开始总会以明文的方式传输密钥。那么一开始这个密钥就泄露了,所以风险不言而喻。。。
所以TLS/SSL在握手的阶段,结合非对称加密的手段,保证只有通信双方才知道对称加密的密码;
2.数字证书的生成及验证
数字证书的生成是分层级的,下一级的证书需要其上一级证书的私钥签名。
所以后者是前者的证书颁发者,也就是说上一级证书的Sbuject Name 是其下一级证书的 Issure Name.
在得到证书申请者的一些必要信息(对象名称,公钥私钥)之后,证书颁发者通过 SHA-256 哈希得到证书内容的摘要,再用自己的私钥给这份摘要加密,得到数字签名。综合已有的信息,生成分别包含公钥和私钥的两个证书。
01.根证书是自签名的,即用自己的私钥签名,不需要其他证书的私钥来生成签名
02.当客户端走https访问站点时,服务器会返回整个证书链。
iOS 上对证书链的验证
01. 信任链中如果只含有有效证书并且可信锚点结尾,那么这个证书就被认为是有效的。可信锚点指的是系统隐式信任证书,通常是包括在系统中的CA根证书,不过可以在验证证书链时,设置自定义证书为可信锚点。
02. NSURLSession实现https,使用 NSURLSession 走 HTTPS 访问网站,-URLSession:didReceiveChallenge:completionHandler: 回调中会收到一个 challenge,也就是质询,需要你提供认证信息才能完成连接,这时候可以通过 challenge.protectionSpace.authenticationMethod 取得保护空间要求我们认证的方式,如果这个值是 NSURLAuthenticationMethodServerTrust 的话,我们就可以插手 TLS 握手中“验证数字证书有效性”这一步。
系统的默认实现(也即代理不实现这个方法)是验证这个信任链,结果是有效的话则根据 serverTrust 创建 credential 用于同服务端确立 SSL 连接。否则会得到 “The certificate for this server is invalid...” 这样的错误而无法访问。
比如在访问 https://www.google.com 的时候咧,我们不实现这个方法也能访问成功的。系统对 Google 服务器返回来的证书链,从叶节点证书往根证书层层验证(有效期、签名等等),遇到根证书时,发现作为可信锚点的它存在与可信证书列表中,那么验证就通过,允许与服务端建立连接。
看考地址:http://www.cnblogs.com/oc-bowen/p/5896041.html 02.ios中的网络加密