Karam
Articles71
Tags52
Categories15
HTTPS协议学习

HTTPS协议学习

什么是HTTPS

HTTPS规定了新的协议名,默认端口号443,它让HTTP运行在安全的SSL/TLS协议上,收发报文不再使用Socket API,而是调用专门的安全接口

SSL/TLS

SSL即安全套接层,处于OSI的第五层(会话层)他发展了v1,v2,v3版本,在v3时期改名叫TLS传输层安全

对称加密和非对称加密

对称加密指的是,加密和解密的时候使用同一个密钥,双方约定好同一个公钥。对称加密算法有AES和ChaCha20
非对称加密有两个密钥,一个公钥,一个私钥,使用公钥加密后智能使用私钥来解密,使用私钥加密后只能用公钥来解密。非对称加密算法有:RSA,DSA等
混合加密,这也是当前TLS采取的加密方式,结合了对称加密和非对称加密

混合加密的过程

  1. 客户端发送查询公钥的请求
  2. 服务器返回公钥A给客户端
  3. 客户端生成一个随机uid,生成两个随机字符串作为两个密钥,一个用于对称加密数据的密钥B,一个用于Mac生成的密钥C,密钥B是一个身份标识,uid和两个密钥是成对的
  4. 客户端发生上面生成的两个密钥给服务端,这个请求的过程使用公钥加密
  5. 服务器获取后通过私钥解密,获取之前生成的两个密钥、
  6. 客户端正常发送请求,请求的内容通过密钥B对称加密,并附上Mac和Nonce
  • Nonce是随机的字符串,用于防重放的验证,所以客户端每次请求都要随机生成一个新的Nonce
  • Mac的计算规则,把请求中涉及的参数拼成一个大字符串,然后通过专门的Mac算法HMAC对其进行散列,得到一个Mac值,
  1. 服务器进行防重放验证,防篡改验证和解密请求
  2. 服务器进行业务处理
  3. 通过对称加密对响应内容进行加密并返回

    数字签名与证书

    摘要算法

    摘要算法主要是为了保证数据的完整性,也就是常说的散列函数,哈希函数
    把任意长度的数据加密压缩成固定长度,且独一无二的”摘要“字符串

    数字签名

    用于确认身份,使用私钥+摘要算法就能实现数字签名。
    数字签名使用私钥加密,使用公钥解密,签名和公钥一样完全公开,任何人都可以获取,但是签名只有用私钥对应的公钥才能解开
    CA是证书认证机构,把公钥,序列号,用途,颁发者,有效期等信息达成一个包再前面,证明与公钥关联的各种信息,形成数字证书
    证书链,小一点的CA可以让大的CA签名认证,链条的最后是根证书

    TLS1.2的连接过程

    TLS协议的组成

    TLS包括几个子协议,比较常用的有记录协议、警报协议、握手协议、变更密码规范协议等

记录协议规定了TLS收发数据的基本单位:记录。所有其他子协议都需要通过记录协议发出。多个记录可以在同一个TCP包里一次性发出。
警报协议的职责是向对方发出警报信息
握手协议是TLS里最复杂的子协议,浏览器和服务器在握手过程中协商TLS版本号,随机数,密码套件等信息,然后交换证书和密钥参数,最终双方协商得到会话密钥,用于后续的混合加密系统
变更密码规范协议通知对方,后续的数据都将使用密码加密保护

ECDHE握手过程

  1. TCP建立连接之后,浏览器会收先发送一个”Clinet Hello“的消息,里面有客户端的版本号,支持的密码套件,还有一个随机数,用于生成会话密钥
  2. 服务器收到消息后,会返回一个”Server Hello“的消息,把版本号对一下,也给出随机数,然后从客户端的密码套件列表中选一个作为本地通信使用的密码套件
  3. 服务器为了证明自己的身份,把证书发给客户端
  4. 发生证书后再发送”Server Key Exchange“消息,里面是椭圆曲线的公钥,用来实现密钥交换算法,再加上自己的私钥签名认证。
  5. 服务器发送一个”Server Hello Done“表示服务器Hello完成
  6. 这时服务器要走证书链逐级验证,确认证书的真实性,再用证书公钥验证前面,就确认了服务器的身份
  7. 客户端安全密码套件的要求,生成一个公钥,用”Client Key Exchange“消息发给服务器,然后客户端和服务端都有密钥交换算法的参数,就是用ECDHE算法,算出”Pre-Master“,其实也是一个随机数,用Client Random,Server Random,Pre-Master生成一个用于加密会话的主密钥,交Master-Secret
  8. 使用Master-Secret扩展出更多密钥,客户端发一个”Change Clipher Spec“,然后再发一个Finished消息,把之前所有发送的数据做个摘要,在加密一下,让服务器做个验证

    TLS1.3特性解析

    TLS1.3的改进目标是:兼容、安全与性能

    最大化兼容性

    因为TLS1.3要保证广泛部署的”老设备“能够继续使用,所以保持现有的记录格式不变,通过”伪装“来实现兼容,使得TLS1.3看起来像TLS1.2
    如何区别1.2和1.3?
    这要用到一个新的扩展协议,通过在记录末尾添加一系列”扩展字段“来增加新的功能,老版本的TLS不认识他可以直接忽略,这就实现了”向后兼容“。
    TLS1.3协议,握手的”Hello“消息后面就必须有”supported_versions“扩展,它标记了TLS的版本号,使用它就能区分新旧协议。

    强化安全

    TLS1.3里只保留了AES、ChaCha20对称加密算法,分组模式只能用AEAD和GCM、CCM和Poly1305,摘要算法只能用SHA256、SHA384,密钥交换算法只有ECDHE和DHE,椭圆曲线只保留五种

    提升性能

    HTTPS建立连接的时候要做TLS握手,在1.2中会多花两个消息往返2RTT,TLS1.3压缩了Hello协商过程,删除了Key Exchange消息,把握手时间减少到了1RTT
    具体实现:
    客户端在”Client Hello“消息里直接用”supported_groups“带上支持的曲线,用”Key_share“带上曲线对应的客户端公钥参数,用”signatrue_algorithms“带上签名算法
    服务器收到这些扩展里选定一个曲线和参数,再用”Key_share“阔炸返回服务器这边的公钥参数,实现双方的密钥交换
    TLS1.3还多了个安全强化措施,”Certificate Verify“消息,用服务器的私钥把前面的曲线、套件、参数等握手数据加了前面,作用和”Finished“消息差不多,由于是私钥前面,所以强化了身份认证和防篡改

    HTTPS的优化

    HTTPS比HTTP增加了一个TLS握手的步骤我,增加的消耗有:
  • 产合用于密钥交换的临时公私钥对
  • 验证证书时访问CA获取CEL或者OCSP
  • 非对称加密解密处理”Pre-Master“

    硬件优化

    更快的CPU;选择使用SSL加速卡,让专门的硬件来做非对称加密解密,分担CPU的压力;SSL加速服务器,用专门的服务器集群来计算

    软件优化

    软件升级,协议优化
    软件升级可以把Linux内核升级,Nginx升级,OpenSSL升级
    协议优化尽量采用TLS1.3

证书优化,一个是证书传输,一个是证书验证
会话复用
和HTTP Cache一样,使用Session ID,下一次客户端发送请求过来的时候直接使用主密钥回复会话状态,跳过证书验证和密钥交换
预共享密钥