iOS中HTTPS的安全连接问题

这里自己总结了一下iOS中自己用到的HTTPS知识。
一、TCP为什么要三次握手,四次挥手?

  1. TCP三次握手建立连接是确保连接并且协商确认Server和Client端初始序列号的最少次数。
  2. 断开连接需要四次挥手,首先客户端发送FIN断开请求报文(1次),因为在服务器收到断开请求后,需要完成自己断开之前的数据传输,所以只能先发送一个确认收到请求的ACK数据包(2次),再发送断开确认报文(FIN + ACK包)(三次),客户端收到这个(FIN + ACK)包后,最后发送一个ACK报文给服务器(四次),服务器收到后即刻断开连接。
    由于看懂链接中这一篇之后就可以很好地理解了,所以这里引用别人的文章TCP的三次握手与四次挥手理解
二、HTTPS怎么保证安全性的? HTTPS = HTTP + SSL/TLS,HTTPS的安全性由SSL/TLS协议提供,从3个方面保证数据传输的安全性。* TLS是SSL版本的演进版本,目前有TLS1.3, TLS1.2, TLS1.0, SSL 3.0, SSL2.0, 服务器会选择客户端能支持的最高版本*
1. 身份认证
客户端请求建立HTTPS连接时,首先需要确认对方确实是我们的目标服务器, 避免中间人攻击。

iOS中HTTPS的安全连接问题
文章图片
不确认通信方身份的安全隐患
我们一般通过验证服务器CA证书的方式来确认目标服务器。服务器收到客户端请求后会发送一个证书(可以是自建证书、CA数字证书)给客户端,客户端会接收到质询(Challenge)质询里面包含了服务器的证书, 这个时候客户端需要对这个证书进行验证,验证通过后设置为信任,才能成功建立连接。iOS中收到质询(challenge)的代理方法是:对证书的验证可以参考AFNetworking里面的HTTPS安全策略实现原理
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler

HTTPS建立连接时,如果使用双向验证的话,需要生成客户端证书,成本大,所以一般是采取客户端验证服务器证书,服务器根据实际需要来验证客户端。
使用HTTPS通信需要进行证书验证(或者取出证书里面的公钥进行验证),否则起不到身份认证的作用。
2. 内容加密
HTTPS依靠SSL/TLS建立了一个加密传输通道,会对传输的数据加密。SSL/TLS使用非对称加密与对称加密组合来实现,建立连接时,在TLS/SSL握手的过程中,客户端跟服务器端会协商好对称加密密钥和加密算法,使用非对称加密的方式将对称加密的秘钥发送给服务器,在通信时使用这个对称加密的秘钥(由客户端负责最终生成)将内容加密。具体可以查看文章
详解TLS1.3的握手过程
SSL/TLS 握手过程
3. 完整性保护
在传输的过程中,即使数据不能被解密,但存在数据中途被篡改、破坏的可能性,所以HTTPS如何应对?具体方法如下:
以下是保证完整性的关键
  1. 当服务器或客户端使用主密钥(也就是对称加密时的这个秘钥)加密数据时,它还会计算明文数据的校验和(哈希值),这个校验和称为消息验证代码(MAC)。
  2. 在发送之前将MAC包含在加密数据中。因为对称加密密钥用于从数据中生成MAC,以确保传输过程中攻击者无法从数据中生成相同的MAC,故而MAC被称为HMAC(哈希消息认证码)。
  3. 在接收到消息时,解密器将MAC与明文分开,然后用它的密钥计算明文的校验和,并将其与接收到的MAC进行比较,如果匹配,那我们就可以得出结论:数据在传输过程中没有被篡改。
【iOS中HTTPS的安全连接问题】客户端发送数据给服务器端原理也是一样。
关于HTTPS,你需要知道的全部
SSL/TLS协议详解(下)——TLS握手协议
详解HTTPS是如何确保安全性的?

    推荐阅读