文章目录
HTTPS(HyperText Transfer Protocol Secure),译为:超文本传输安全协议,常称为 HTTP over TLS、HTTP over SSL、HTTP Secure,由网景公司于1994年首次提出。
HTTPS的默认端口号是443(HTTP是80)
现在在浏览器上输入 http://www.baidu.com 会自动重定向到 https://www.baidu.com
1.SSL/TLS
HTTPS 是在 HTTP 的基础上使用 SSL/TLS 来加密报文,对窃听和中间人攻击提供合理的防护。
SSL/TLS 也可以用在其他协议上,比如 FTP --> FTPS,SMTP --> SMTPS。
TLS(Transport Layer Security),译为:传输层安全性协议,前身是 SSL(Secure Sockets Layer),译为:安全套接层。
历史版本信息:
- SSL 1.0:因存在严重的安全漏洞,从未公开过
- SSL 2.0:1995年,已于2011年弃用(RFC 6176)
- SSL 3.0:1996年,已于2015年弃用(RFC7568)
- TLS 1.0:1999年(RFC 2246)
- TLS 1.1:2006年(RFC 4346)
- TLS 1.2:2008年(RFC 5246)
- TLS 1.3:2018年(RFC 8446)
2.OpenSSL
OpenSSL 是 SSL/TLS 协议的开源实现,始于1998年,支持Windows、Mac、Linux等平台。
Linux、Mac一般自带OpenSSL。
Windows下载安装OpenSSL:https://slproweb.com/products/Win32OpenSSL.html
常用命令
- 生成私钥:
openssl genrsa -out mj.key
- 生成公钥:
openssl rsa -in mj.key -pubout -out mj.pem
可以使用 OpenSSL 构建一套属于自己的CA,自己给自己颁发证书,称为“自签名证书”。
3.HTTPS
3.1 HTTPS的成本
证书的费用
加解密计算
降低了访问速度
有些企业的做法是:包含敏感数据的请求才使用 HTTPS,其他保持使用 HTTP。
3.2 HTTPS的通信过程
总的可以分为 3 大阶段:
- TCP的3次握手
- TLS的连接
- HTTP请求和响应
3.3 TLS 1.2 的连接
大概是有 10 大步骤,下图中省略了中间产生的一些ACK确认。
(1) Client Hello
TLS的版本号
支持的加密组件(Cipher Suite)列表。加密组件是指所使用的加密算法及密钥长度等。
一个随机数(Client Random)
(2) Server Hello
TLS的版本号
选择的加密组件,是从接收到的客户端加密组件列表中挑选出来的。
一个随机数(Server Random)
(3) Certificate
服务器的公钥证书(被 CA 签名过的)
(4) Server Key Exchange
用以实现 ECDHE 算法的其中一个参数(Server Params)。ECDHE 是一种密钥交换算法。
为了防止伪造,Server Params 经过了服务器私钥签名。
(5) Server Hello Done
告知客户端:协商部分结束。
目前为止,客户端和服务器之间通过明文共享了 Client Random、Server Random、Server Params,而且,客户端也已经拿到了服务器的公钥证书,接下来,客户端会验证证书的真实有效性。
(6) Client Key Exchange
用以实现 ECDHE 算法的另一个参数(Client Params)
目前为止,客户端和服务器都拥有了 ECDHE 算法需要的 2 个参数:Server Params、Client Params。
客户端、服务器都可以使用 ECDHE 算法根据 Server Params、Client Params 计算出一个新的随机密钥串 Pre-master secret,然后结合 Client Random、Server Random、Pre-master secret 生成一个主密钥,最后利用主密钥衍生出其他密钥:客户端发送用的会话密钥、服务器发送用的会话密钥等。
(7) Change Cipher Spec
告知服务器:之后的通信会采用计算出来的会话密钥进行加密。
(8) Finished
包含连接至今全部报文的整体校验值(摘要),加密之后发送给服务器。这次握手协商是否成功,要以服务器是否能够正确解密该报文作为判定标准。
(9) Change Cipher Spec
(10) Finished
到此为止,客户端服务器都验证加密解密没问题,握手正式结束,后面开始传输加密的 HTTP 请求和响应。