小宋爱睡觉 小宋爱睡觉
首页
  • HTML
  • CSS
  • JavaScript
  • Vue
  • React
  • 计算机网络
  • 浏览器原理
  • 性能优化
  • 设计模式
手写系列
  • 字符串
  • 数组
  • 链表
  • 树
  • 动态规划
  • 排序算法
  • GitHub (opens new window)
  • JueJin (opens new window)
首页
  • HTML
  • CSS
  • JavaScript
  • Vue
  • React
  • 计算机网络
  • 浏览器原理
  • 性能优化
  • 设计模式
手写系列
  • 字符串
  • 数组
  • 链表
  • 树
  • 动态规划
  • 排序算法
  • GitHub (opens new window)
  • JueJin (opens new window)
  • HTTP协议与请求方法
  • HTTPS协议
    • 介绍一下TLS/SSL的工作原理
    • 什么是数字证书
    • HTTPS的握手过程
    • ECDHE握手和RSA握手又有什么区别
    • TLS1.3版本较TLS1.2的改进
    • SSL连接断开后如何恢复
    • HTTPS的特点
    • https如何保证安全
    • 题外话:如何在html中将http请求转换成https
  • 状态码
  • DNS和网络模型
  • TCP和UDP
  • WebSocket
  • 计算机网络
Crucials
2021-12-12

HTTPS协议

# HTTPS协议

https协议是超文本传输安全协议,经由http进行通信,利用SSL/TLS来加密数据包,提供身份认证,保护交换数据的隐私与完整性

img

http协议采用明文传输,存在信息窃听,信息篡改,信息劫持的风险,而tls/ssl具有身份认证、信息加密、完整性校验的功能

他新增的安全层主要是对发起的http请求的数据进行加密操作和对收到的http内容进行解密操作

# 介绍一下TLS/SSL的工作原理特别重要

全称安全传输层协议, 是介于TCP和HTTP之间的一层安全协议

主要依赖 散列函数hash 对称加密 非对称加密,作用如下

  • 基于散列函数验证信息的完整性

  • 对称加密算法采用协商的密钥对数据加密

  • 非对称加密实现对身份认证和密钥协商

img

  • 散列函数hash

    • 常用的散列函数有md5 sha1 sha256,特点为单向不可逆,对输入数据非常敏感,输出长度固定,任何数据的修改都会改变散列函数的结果,可以用于防止信息篡改并验证数据的完整性
    • 特点是在信息传输过程中,散列函数不能防止信息防篡改,由于传输的是明文,中间人可以修改信息后重新计算信息的摘要,所以需要对传输的信息和信息摘要进行加密
  • 对称加密

    • 加密方法是双方使用同一个密钥对数据进行加密和解密,但是如何保证密钥传输的安全性,密钥可能在通过网络传输的过程中被其他人获取到
    • 常见的对称加密有AES-CBC DES 3DES AES-GCM,通讯方式为一对一
    • 对称加密的特点就是一对一,需要共享相同的密码,密码的安全是保证信息安全的基础,服务器和N个客户端通信则需要维持N个密码记录且不能修改密码
  • 非对称加密

    • 拥有两个密钥,一个公钥一个私钥,公钥是公开的,私钥是保密的,用私钥加密数据,用公钥才能解密,用公钥加密,只有私钥才能解密,任何想通信的客户端都可以用公开的公钥进行加密,然后我们用私钥进行解密,保证数据的安全,但是缺点是加密过程很慢
    • 常见的非对称加密为RSA ECC DH ,客户端之间不能相互解密信息,只能和服务器进行加密通信,服务器可以实现一对多的通信,客户端可以用来验证掌握私钥的服务器的身份
    • 特点是信息一对多,服务器只需要维持一个私钥就能和多个客户端进行通信,但是服务器发送出去的信息能被所有客户端解密,计算复杂,加密速度慢

综上所述

tls/ssl的工作方式是客户端使用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的秘钥。对称加密算法采用协商秘钥对信息以及信息摘要进行加密通信,不同节点采用对称秘钥不同,从而保证信息只能通信双方获取。

# 什么是数字证书特别重要

为了避免中间人攻击,我们采用数字证书

使用一种hash算法对公钥和其他信息进行加密,生成一个信息摘要,然后让有公信力的认证中心(CA)用他的私钥对消息摘要加密,形成签名,最后将原始的信息和签名和在一起,称为数字证书,当接收方收到数字证书先根据原始信息用相同的hash算法生成摘要,使用公证处的公钥对数字证书的摘要进行解密,最后将解密的摘要和生成的摘要进行对比,可以发现得到的信息是否被篡改

最重要的是认证中心的可靠性,一般浏览器会内置一些顶层的认证中心的证书,相当我们信任了他

img

# HTTPS的握手过程特别重要

RSA握手

  1. 客户端首先发送 client_random、TLS版本号、加密套件列表给服务器
  2. 服务器在接收到之后确认TLS版本号,同时发送server_random、需要使用的加密套件、自己的证书给客户端
  3. 客户端在收到这些信息之后,首先是会对服务器的证书进行验证,若是验证成功则会用RSA算法生成一个pre_random,且用服务器的公钥(在证书中)加密pre_random发送给服务器。
  4. 此时,客户端有了 client_random、server_random、pre_random,它会将这三个参数通过一个伪随机函数计算得出最终的secret,这个secret就是它们后续通信所要用的对称密钥。
  5. 服务器接收到了刚刚用自己公钥加密的pre_random之后,用自己的私钥进行解密,得到里面的 pre_random,用和客户端一样的方式生成secret。
  6. 之后就用这个 secret 对称密钥加密报文传输。

TLS1.2的ECDHE握手

  1. 客户端在第一次发送HTTPS请求的时候,会把 client_random、TLS版本号、加密套件列表发送给服务器

  2. 服务器在接收到之后确认TLS的版本号,同时发送 server_random、server_params、需要使用的加密套件、以及自己的证书给客户端

  3. 客户端在收到这些信息之后,首先是会对服务器的证书进行验证,若是验证成功则会传递一个 client_params 给服务器

    • 与此同时客户端会通过 ECDHE算法 计算出一个pre_random。其中是传入了两个参数,一个是 client_params,还一个是 server_params。(也就是说:ECDHE(client_params, server_params) = pre_random)
    • 这时候客户端就同时拥有了 client_random、server_random、pre_random,它会将这三个参数通过一个伪随机函数计算得出最终的secret,这个 secret 就是它们后续通信所要用的对称密钥。
  4. 而在客户端生成完secret之后,会给服务器发送一个收尾消息,告诉服务器之后都要用对称加密,且对称加密的算法是用第一次约定好的。

  5. 服务器它在接收到刚刚传递过来的client_params之后,也会使用和客户端一样的方式生成secret,并且也会发送一个收尾消息给客户端。

  6. 当双方都收到收尾消息并验证成功之后,握手就结束了。后面开始用这个secret对称密钥加密报文进行传输。

(ECDHE基于椭圆曲线离散对数,传入的两个参数也被叫做椭圆曲线的公钥)

# ECDHE握手和RSA握手又有什么区别

  1. 生成secret(对称密钥)的过程不同。
    • RSA中是使用RSA算法生成一个pre_random并用服务器的公钥加pre_random发送给服务器,然后各自用伪随机函数生成相同的secret对称密钥;
    • 而在ECDHE握手中,它没有用到RSA算法,而是用ECDHE算法生成的pre_random,且这个过程中比RSA多了client_params和server_params两个参数。
  2. 在生成完secret之后,ECDHE握手在客户端发送完收尾消息后可以提前抢跑,直接发送 HTTP 报文,节省了一个 RTT,不必等到收尾消息到达服务器,然后等服务器返回收尾消息给自己,直接开始发请求。这也叫TLS False Start。
  3. 最主要的:RSA不具备向前安全性,而ECDHE具有向前安全性

(向前安全性:一次破解并不影响历史信息的性质就是向前安全性)

向前安全性

一句话概括:一次破解并不影响历史信息的性质就是向前安全性。

比如在RSA握手的过程中,客户端拿到了服务端的公钥,然后用此公钥加密pre_random给服务端。如果此时有第三方有服务端的私钥,并且截获了之前所有报文的时候,那么它就可以破解这段密文并拿到pre_random、client_random、server_random并根据对应的伪随机函数生成secret,即拿到了最终通信的对称密钥,每一个历史报文都能通过这样的方式进行破解。它就不具有向前安全性。

但是ECDHE在每次握手的时候都会产生一个临时的密钥对(也就是client_params、server_params),即使第三方有了私钥能破解,但是对之前的历史报文并没有影响。它就具有向前安全性。

# TLS1.3版本较TLS1.2的改进

  1. 强化安全

废除了很多的加密算法,只保留了5个加密套件。其中最主要的是废弃了RSA,因为在2015年发现了PRAEK攻击,即已经有人发现了RSA的漏洞能进行破解;而且RSA不具备向前安全性。

  1. 提高性能

同时利用会话复用节省了重新生成密钥的时间,利用 PSK 做到了0-RTT连接。

# SSL连接断开后如何恢复

一共有两种方法来恢复断开的 SSL 连接,一种是使用 session ID,一种是 session ticket。

通过session ID

使用 session ID 的方式,每一次的会话都有一个编号,当对话中断后,下一次重新连接时,只要客户端给出这个编号,服务器如果有这个编号的记录,那么双方就可以继续使用以前的秘钥,而不用重新生成一把。目前所有的浏览器都支持这一种方法。但是这种方法有一个缺点是,session ID 只能够存在一台服务器上,如果我们的请求通过负载平衡被转移到了其他的服务器上,那么就无法恢复对话。

通过session ticket

另一种方式是 session ticket 的方式,session ticket 是服务器在上一次对话中发送给客户的,这个 ticket 是加密的,只有服务器能够解密,里面包含了本次会话的信息,比如对话秘钥和加密方法等。这样不管我们的请求是否转移到其他的服务器上,当服务器将 ticket 解密以后,就能够获取上次对话的信息,就不用重新生成对话秘钥了。

# HTTPS的特点重要

优点

  • 可以认证用户和服务器 确保数据可以正确发送到客户端和服务端

  • 可以加密传输 身份认证 防止数据在传输过程中被窃取 修改 确保数据安全性

  • 不是绝对的安全,但是大幅增加中间人攻击的成本

缺点

  • 需要做服务器和客户端双方的加密和解密处理,耗费更多服务器资源,过程复杂

  • 握手阶段比较费时,增加页面的加载时间

  • ssl证书收费 功能越强大费用越高

  • https连接服务端资源占用高很多,支持访客稍多的网站需要投入更大成本

  • ssl证书需要绑定ip,不能在同一ip上绑定多个域名

# https如何保证安全重要

先理解对称加密和非对称加密

  • 对称加密为通信的双方都使用同一个密钥进行加解密,对称加密虽然简单性能好,但是无法解决首次把秘钥发给对方的问题,易被黑客拦截
  • 非对称加密
    • 私钥 + 公钥 = 秘钥对
    • 私钥加密只能公钥解密 公钥加密只能私钥解密
    • 通信之前对方把自己的公钥先发给对方
    • 对方拿着公钥加密数据响应对方 等到数据传输到对方,对方再用自己的私钥进行解密
    • 安全性高 但是速度慢 影响性能

解决方案

结合两种加密方式 将对称加密的密钥通过非对称加密的公钥进行加密,然后发送出去,接收方通过自己的私钥进行解密,获得对称加密的密钥,然后双方可以使用对称加密进行沟通

但是如果中间人 把互发的公钥换成自己的公钥就可以轻松解密通信双方发送的数据了

所以要有ca证书,防止中间人攻击

如果中间人篡改了证书,是不是身份证明无效了,这时候需要新的技术,数字签名

数字签名是ca自带的hash算法对证书的内容进行hash得到一个摘要,再用ca的密钥进行加密,最后组成数字签名,当别人收到证书的时候,用同样的hash算法再次生成摘要,用ca的公钥对数字签名解密,得到ca创建的消息摘要,然后对比可知有没有被篡改

# 题外话:如何在html中将http请求转换成https

利用meta标签把http请求换为https:

<meta http-equiv ="Content-Security-Policy" content="upgrade-insecure-requests">
1
上次更新: 2022/03/10, 14:51:31
HTTP协议与请求方法
状态码

← HTTP协议与请求方法 状态码→

Copyright © 2021-2025 粤ICP备2021165371号
  • 跟随系统
  • 浅色模式
  • 深色模式