网络协议系列十五 - HTTPS
Posted 1024星球
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络协议系列十五 - HTTPS相关的知识,希望对你有一定的参考价值。
HTTPS由网景公司于1994年首次提出。HTTPS是在HTTP的基础上使用SSL/TLS来加密报文,对窃听和中间人攻击提供合理的防护。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8CwE4hWY-1624499299124)(https://blog.idbeny.com/jv2po.png@normal)]
一、HTTPS
HTTPS(HyperText Transfer Protocol Secure),超文本传输安全协议。常称为HTTP over TLS、HTTP over SSL、HTTP Secure。
HTTPS的默认端口号是443(HTTP是80)。
在浏览器中输入http://www.baidu.com
,会自动跳转到https://www.baidu.com
,这个跳转指向不是浏览器自己决定的,是访问http://www.baidu.com
后,所在服务器返回了重定向地址。
如果不加协议头,浏览器默认域名使用HTTPS。
HTTPS的成本:证书的费用、加解密的计算等、降低了访问速度。有些企业的做法是:包含敏感数据的请求才使用HTTPS,其他仍让使用HTTP,例如工商银行(http://www.icbc.com.cn、https://mybank.icbc.com.cn)。
HTTPS的通信过程,总的可以分为3大阶段:
- TCP的3次握手
- TLS的连接
- HTTP请求和响应
二、SSL/TLS
TLS(Transport Layer Security),传输层安全性协议。前身是SSL(Secure Sockets Layer),安全套接层。
SSL/TLS也可以用在其他协议上,比如FTP -> FTPS
、SMTP -> SMTPS
。
2.1. 历史版本信息
- SSL 1.0:因存在严重的安全漏洞,从未公开过
- SSL 2.0:1995年,已于2011年弃用(参考RFC_6176)。
- SSL 3.0:1996年,已于2015年弃用(参考RFC_7568)
- 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.2. OSI
SSL/TLS是在应用层和传输层之间,因为SSL是为HTTP的数据包进行加密的,所在必须在数据包到达传输层前介入。
2.3. OpenSSL
OpenSSL是SSL/TLS协议的开源实现,始于1998年,支持Windows、Mac、Linux等平台。Linux、Mac一般自带OpenSSL,Windows需要下载安装(地址:https://slproweb.com/products/Win32OpenSSL.html)。
常用命令:
- 生成私钥:
openssl genrsa -out 姓名.key
- 生成公钥:
openssl rsa -in 姓名.key -pubout -out 姓名.pem
可以使用OpenSSL构建一套属于自己的CA,自己给自己颁发证书,称为“自签名证书”。
2.4. TLS 1.2 的连接
大概有10大步骤,图片中省略了中间产生的一些ACK确认。
第一步:Client Hello
- TLS的版本号
- 支持的加密组件列表(Cipher Suite)
- 加密组件是指所使用的加密算法及密钥长度等
- 一个随机数(Client Random)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DJOCrInu-1624499299173)(https://blog.idbeny.com/fjrmw.png@normal)]
第二步:Server Hello
- TLS的版本号
- 选择的加密组件
- 是从接收到的客户端加密组件列表中挑选出来的
- 一个随机数(Server Random)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LsGBo3F4-1624499299177)(https://blog.idbeny.com/nvmev.png@normal)]
第三步:Certificate
- 服务器的公钥证书(被CA签名过的)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H63j62vm-1624499299185)(https://blog.idbeny.com/svul5.png@normal)]
第四步:Server Key Exchange
- 用以实现ECDHE算法的其中一个参数(Server Params)
- ECDHE是一种密钥交换算法
- 为了防止伪造,Server Params经过了服务器私钥签名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cv0yrK7x-1624499299191)(https://blog.idbeny.com/0tepd.png@normal)]
第五步:Server Hello Done
- 告知客户端:协商部分结束
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DX0oNaUy-1624499299199)(https://blog.idbeny.com/v22x3.png@normal)]
到第五步为止,客户端和服务器之间都是通过明文共享了:Client Random、Server Random、Server Params。而且客户端也拿到了服务器的公钥证书,接下来客户端会验证证书的真实有效性。
第六步:Client Key Exchange
- 用以实现ECDHE算法的另一个参数(Client Params)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6k6nB6Po-1624499299201)(https://blog.idbeny.com/hbu7k.png@normal)]
到目前为止,客户端和服务器都拥有了ECDHE算法需要的2个参数:Server Params、Client Params。此时客户端和服务器都可以使用ECDHE算法,根据Server Params、Client Params计算出一个新的随机密钥串(Pre-master secret)。然后结合Client Random、Server Random、Pre-master secret生成一个主密钥,最后利用主密钥衍生出其他密钥:客户端发送用的会话密钥、服务器发送用的会话密钥等。
第七步:Change Cipher Spec
- 告知服务器:之后的通信会采用计算出来的客户端会话密钥进行加密。
第八步:Finished
包含连接至今全部报文的整体校验值(摘要),加密之后(用会话密钥进行加密)发送给服务器。这次握手协商是否成功,要以服务器是否能够正确解密该报文作为判定标准
第九步:Change Cipher Spec
服务器通知客户端,可以进行加密通信(服务器使用服务器会话密钥)。
第十步:Finished
告知客户端:服务器收到的报文加密后的校验值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eQlVybWm-1624499299221)(https://blog.idbeny.com/zy7z0.png@normal)]
到此为止,客户端服务器都验证加密解密没问题,握手正式结束。
开始加密传输:
三、Wireshark解密HTTPS
设置环境变量SSLKEYLOGFILE(浏览器会将key信息导出到这个文件)。设置完成后,最好重启一下操作系统。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JECm4cxn-1624499299232)(https://blog.idbeny.com/4aa84.png@normal)]
在Wireshark中选择这个文件(编辑 -> 首选项 -> Protocols -> TLS):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P6i2vjQO-1624499299241)(https://blog.idbeny.com/l38ya.png@normal)]
四、配置服务器HTTPS
4.1. 生成证书
环境:Tomcat9.0.34、JDK1.8.0_251
首先,使用JDK自带的keytool生成证书(一个生成免费证书的网站:https://freessl.org/)。
命令:keytool -genkeypair -alias daben(别名) -keyalg RSA(密钥算法名称) -keystore /User/Developer/Desktop/daben.jks(输出位置)
4.2. 配置Tomcat
将证书*.jks
文件放到TomcatHome/conf
目录下(放到哪个位置不重要,只要在server.xml配置中能够正确配置路径就行)。
修改TomcatHome/conf/server.xml
中的Connector
:
<Connector port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/daben.jks"
type="RSA"
certificateKeystorePassword="123456"/>
</SSLHostConfig>
</Connector>
重启Tomcat。由于是自签名证书,浏览器会不信任(浏览器会发出不安全警告),但不影响我们学习研究使用。
以上是关于网络协议系列十五 - HTTPS的主要内容,如果未能解决你的问题,请参考以下文章
Linux从青铜到王者第十五篇:Linux网络编程套接字两万字详解