协议_https协议
http
http协议是将数据以明文
的形式在网络上传输。若是传输的数据中包含一些敏感信息比如银行卡信息等可能会被有心人攻击造成信息泄露或被篡改。
总结:http协议进行数据传输难以保证数据的隐私性以及数据完整性
,为了保证数据的准确定引入了https这一协议。
https
简单来说https就是安全版的http协议。
HTTPS协议也是一个应用层协议,是在http的基础上使用TLS/SSL(套接字
)进行加密,这样通信就不容易受到拦截和攻击。
TLS/SSL
- TLS:传输加密协议,规定了如何为网络中的数据进行加密和解密。
- SSL:早期由网景公司设计的加密协议,后贡献给IETF组织,并最终命名为TLS。
- tips:除了HTPPS外,TLS可以被用于任何基于TCP/IP协议的上层协议或应用程序,如SFTP协议、数据库间通信加密…
常见的加密方式
常见的加密算法有对称加密、非对称加密、摘要算法
HTTP加密过程探究
[1] 只使用对称加密
如上图所示
- 客户端发送请求:其中包含了客户端所支持的TLS版本以及加密算法等信息;
- 服务端接收请求:从中选取最优的TLS版本以及加密算法 并将这些信息反馈给客户端
- 客户端接收响应:生成一段随机字符串(这段随机字符串被称为
预主密钥
),通过服务端指定的加密函数和加密算法将这段随机字符串生成一对密钥(被称为会话密钥
) 用于后续数据传输时的加密和解密; - 客户端发送请求:将预主密钥发送给服务端并告知服务端生成密钥的算法等信息
- 服务端接收请求: 接收信息后以同样的方式生成会话密钥
- 此时 客户端和服务端 就可以 以会话密钥加解密数据进行通信了
引入对称加密之后即使数据被截获, 由于黑客不知道密钥是什么也就无法进行解密,获取原始数据了。
问题
如何将预主密钥传递给服务端成为最大的难题
若是预主密钥以明文的方式传输,那么在传输过程中 黑客获取到这个预主密钥 他完全可以创建出与客户端相同的会话密钥,最终导致后面所有的传输数据都面临着被破译的风险。
解决
通过非对称加密的方式 来传输预主密钥 确保数据的安全性;
[2] 使用对称加密+非对称加密
非对称加密包含两个不同的密钥文件 => 公钥用于加密私钥用于解密 公钥对外公开任何人都可以随意获取私钥则只有拥有者自己知道
与对称加密不同的是 非对称加密是不可逆
如上图所示
- 客户端发送请求:其中包含了客户端所支持的TLS版本以及加密算法等信息;
- 服务端接收请求:从中选取最优的TLS版本以及加密算法 并将这些信息反馈给客户端 除此之外还会将自己的公钥发送给客户端
- 客户端接收响应:生成一段随机字符串(这段随机字符串被称为
预主密钥
),通过服务端的公钥将预主密钥进行加密并传递给服务端; - 客户端发送请求:将预主密钥发送给服务端并告知服务端生成密钥的算法等信息
- 服务端接收请求: 接收信息后通过私钥解密得到预主密钥
- 客户端和服务端:根据预主密钥通过相同的算法计算得到
会话密钥
- 此时 客户端和服务端 就可以 以会话密钥加解密数据进行通信了
这样即使黑客截取到数据也不知道密钥的原始值是什么,就无法获取后续传递的数据了。
问题
若是在最初建立连接的时候就被黑客监听到 当服务端返回公钥给客户端的时候 黑客截取并模仿生成一个公钥传输给客户端,那么后面无论客户端发送任何数据都不再安全了
如上图
- 服务端发送公钥给客户端 但是中间被黑客拦截了,黑客模拟生成一个类似得公钥并传递给客户端
- 客户端接收到之后认为此公钥是客户端的公钥(实际是黑客传递的)=> 客户端使用该公钥加密预主密钥传输给服务端(实际被黑克拦截 并将黑客生成的预主密钥发送给服务端)
- 后续任何流程都是 客户端与服务端中间加了一个流程与黑客进行数据传输了!
解决
其实上述问题的本质就是客户端无法确定收到的含有公钥的数据报文就是⽬标服务器发送过来的
。
为了解决这一问题 引入了证书这一概念 。
客户端获取的不再是公钥而是证书 => 证书是由证书颁发机构(CA)签发的,用于唯一标识一个站点的身份信息。
[3] 将公钥存放在证书中
证书定义
简单来说 证书就像网站的身份证和护照用于帮助我们鉴别一个网站的真伪。
证书是用于鉴别网站的真实性和有效性,所有人都可以查看网站的证书。
查看证书
证书信息
证书的指纹用于唯一标识一个证书=>确保证书的完整性!
申请证书
证书是由CA机构
办法的,CA机构分布在全球各处
申请证书:
-
向某个心仪的机构提交证书申请
-
申请成功后将其部署到web服务中即可
CA组织机构做了什么呢?
-
CA组织在为申请者申请证书时 会对证书的内容和公钥分别进行hash计算并将得到的值作为证书指纹附加到证书中,同时说明使用的hash算法 => 内容 + 公钥 + 由内容和公钥生成的hash值(证书指纹) + hash算法说明(一般使用hash256)
客户端得到证书之后 使用相同的算法对 内容和公钥进行hash计算 得到的结果与证书指纹进行比对 若是完全一致则表明证书没有被截获/篡改从而确保了证书的完整性。
-
CA组织生成好证书后,会使用CA的私钥进行加密并将加密结果附加到证书
客户端在获取到网站证书后还需要验证证书的真实性 表明该证书确实是由该证书上描述的CA机构所颁发的!
通过数字签名对证书进行加密和解密来验证真伪的 => 使用私钥进行加密 使用公钥进行解密
客户端在获取到网站证书后会使用CA对应的公钥进行解密 => 解密成功则表示客户端使用的公钥与CA加密时使用的私钥是一对密钥从而确保该证书确实是由该CA证书所签发的
问题
现在好像又循环到最初的问题了 => 如何安全的获取CA的公钥呢?
答案就是预安装
其实CA机构在对证书进行签名的时候 使用的是私钥+根证书
根证书最主要的作用之一就是对其他证书进行签名,CA的公钥也被附加在CA的根证书中
每个操作系统都会维护一个根证书库并默认安装好了受信任的全国各地的CA根证书。
当需要认证证书签名时直接从系统中找到对应的CA根证书即可。=> 避免网络传输 不会被窃听/碉堡
总结流程
如上图所示: 先通过TCP三次握手建立连接
-
客户端发送请求:其中包含了客户端所支持的TLS版本以及加密算法等信息;
-
服务端接收请求:从中选取最优的TLS版本以及加密算法 并将这些信息反馈给客户端 除此之外还会将自己的证书发送给客户端
-
客户端接收响应:获取证书 => 验证证书的真实性与完整性,没有问题在证书中拿到服务器的公钥
生成一段随机字符串(这段随机字符串被称为
预主密钥
),将预主密钥使用服务器的公钥进行加密 -
客户端发送请求:将预主密钥发送给服务端并告知服务端生成密钥的算法等信息
-
服务端接收请求: 接收信息后通过私钥解密得到预主密钥
-
客户端和服务端:根据预主密钥通过相同的算法计算得到
会话密钥
-
此时 客户端和服务端 就可以 以会话密钥加解密数据进行通信了
tips: 这一过程也被称为
TLS握手
。
http与https的区别
http是基于TCP协议以明文方式进行传递数据的协议;
不同点 | http | https |
---|---|---|
核心本质 | 信息以明文进行传输,没有任何加密 | 通过http+TLS套接字进行加密数据传输 |
安全性 | 不安全 => 容易被窃听、篡改或冒充 | 安全 => 提供身份认证,确保连接到的是正确的网站,在信息传输过程中数据经过加密、具有校验机制 |
协议与端口号 | 基于 TCP,使用端口 80 | 在 HTTP 基础上加入了 SSL/TLS 加密层,使用端口 443 |
数字证书 | 不需要 | 由受信任的证书颁发机构 (CA) 颁发的 SSL/TLS 证书=> 存在一定开销。 |
工作方式 | 直接与 TCP 通信 | 先与 SSL/TLS 通信,再由 SSL/TLS 和 TCP 通信。相当于在 HTTP 和 TCP 之间加了一个“安全层”。 |