网络基础(十一)HTTPS
HTTPS
概述
HTTPS(英语:HyperText Transfer Protocol Secure,缩写:HTTPS): 安全的超文本传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换资料的隐私与完整性。
HTTPS 的默认端口是 443 端口。
SSL/TLS
SSL(Secure Sockets Layer): 安全套接层,已经废弃。
TLS(Transport Layer Security): 传输安全性协议。
SSL或安全套接字层和TLS(传输层安全)是旨在通过Internet在客户端和服务器之间提供安全通信通道的加密协议。SSL是较旧的加密协议,而TLS是相对较新的版本。拥有SSL/TLS证书的目的不仅是为了进行身份验证,而且是为了建立客户端浏览器与之通信的远程服务器的身份。
SSL/TLS 是一个加密层,HTTP 协议的数据通过 SSL/TLS 层进行加密后 就成了HTTPS的加密数据。

SSL/TLS 处于 运输层 和应用层之间,应用层发送的HTTP ,FTP NNTP 等协议都可以执行TLS加密。数据接收方同样由SSL/TLS 层对加密的数据进行解密,再交给应用层来处理。
Open SSL
OpenSSl 是SSL/TLS 的一种开源实现。支持多种平台。
官网地址: https://www.openssl.org/
LINUX系统中一般自带openSSL。windows下如果使用需要安装open ssl
安装链接 https://github.com/openssl/openssl/blob/master/NOTES-WINDOWS.md
openssl可以实现:秘钥证书管理、对称加密 和非对称加密。
OpenSsl 使用
1 | openssl help 显示所有可用的功能 |
使用openssl计算摘要值

openssl dgst 支持多种单向签名算法,以MD5为例。
1 | C:\Users\Dell>openssl dgst -md5 E:\a |
对指定的文件生成md5的值.
使用openssl生成密钥对
生成私钥
1 | openssl genrsa -out E:\test.key |

根据私钥生成公钥
1 | openssl rsa -in E:\test.key -pubout -out E:\test.pem |

将生成一个私钥文件一个公钥文件.


HTTPS的通信过程
https 的请求在通信过程中,在TCP三次握手后,要建立TLS的连接。
当使用了HTTPS的通信连接后,在TCP三次握手后,还需要建立TLS的连接,TLS连接主要做的事情是进行双端连接的建立,在建立过程中就会完成加密算法的协商约定,为后续数据传输的安全性和完整性做保障。
当一个https 请求发出后,首先建立3次握手,3次握手后,将建立TLS的握手过程。

TLS 请求建立
当在浏览器输入https://baidu.com 后,通过抓包工具确认过程。
使用wireshark 过滤查看到的百度的ip,使用过滤条件
1 | ip.dst==110.242.68.4 || ip.src == 110.242.68.4 |
首先是建立三次握手
client Hello
客户端 —–> 服务端
三次握手后,首先由客户端向服务端发送hello消息。

三次握手接着就是Client Hello

客户端发送的信息中
TLS 的版本号,上面是TLSV1.2
random 发送给服务端一个 随机数。
Cipher Suiters : 发送了一个客户端支持的加密算法和秘钥长度列表,告诉了服务端,客户端支持这些加密算法。

客户端发送了 client Hello 后,服务端还会发送一个没有消息的ACK回应。
Server Hello
**服务端 —–> 客户端 **
server Hello 是服务端首次将客户端发送的招呼信息。

可以看到服务端会发送给客户端。
服务端生成的一个 随机数。
服务端从客户端的加密列表中,选中的确认使用的一个加密算法。
这里秘钥协商算法使用 ECDHE
签名算法使用 RSA
捂手后通信算法使用AES
摘要算法使用 SHA256
Certificate
**服务端 —–> 客户端 **

此步骤为服务端 将公钥发送给客户端.
Server Key Exchange
**服务端 —–> 客户端 **

服务端给到客户端一个参数,此参数是ECDHE算法的一个参数。
此参数是通过签名算法签名的。客户端可用用上一步拿到的公钥解析。
Server Hello Done
**服务端 —–> 客户端 **

服务端告诉客户端,服务端没有东西要发送了。
Client key Exchange
客户端 —–> 服务端

客户端也生成一个 ECDHE 算法的一个参数交给服务端。
目前为止:
客户端 拿到了公钥。
服务端和客户端都生成了一个随机数,并且交换了。
服务端和客户端都生成了一个ECDHE算法的一个参数,并且都交换了。
客户端和服务端将使用这些参数和随机数,分别算出通信会话使用的秘钥。两方算出的值是一样的。
Change Cipher Spec
客户端 —–> 服务端

没有消息内容,仅仅是客户端告诉服务端之前的消息发送使用加密的方式.
Finished
客户端 —–> 服务端

客户端将连接至今全部报文的整体校验值,加密之后发送给服务器。
相当于测试下加密传输是否有问题。
Change Cipher Spec
服务端 —–> 客户端
服务端给客户端发送的信息,告诉客户端使用加密的方式发送消息。
Finished
服务端 —–> 客户端
最终,服务端将至今所有的报文的整体校验值,加密后发送给客户端。

一个tls握手整体连接图


