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
2
3
openssl help 显示所有可用的功能

openssl xx -help 显示特定操作的帮助功能

使用openssl计算摘要值

openssl dgst 支持多种单向签名算法,以MD5为例。

1
2
C:\Users\Dell>openssl dgst -md5 E:\a
MD5(E:\a)= 074fd28eff0f5adea071694061739e55

对指定的文件生成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握手整体连接图