一、前言

本系列文章旨在复习计算机网络核心知识,进一步夯实基础,为以后 参与物联网、音视频、直播、即时通讯等领域的项目做一定的知识储备。

文章列表:

  • 01-计算机网络核心知识|计算机网络通识【计算机网络性能指标、网络协议分层的几种方式、OSI七层模型概念通识】
  • 02-计算机网络核心知识|【搭建调试环境、新建Java项目、计算机通信基础、计算机连接方式、集线器/网桥/交换机/路由器】
  • 03-计算机网络核心知识|【MAC地址、IP地址的组成、IP地址的分类、CIDR、子网掩码、超网】
  • 04-计算机网络核心知识|【 静态路由、动态路由、数据包的传输、ISP、服务器机房、网络分类、家用无线路由器、公网IP、
  • 05-计算机网络核心知识|物理层/数据链路层【模拟信号&&数字信号、数据链路层】
  • 06-计算机网络核心知识|网络层【IP数据包Packet、网络协议、Checksum、源IP地址和目标IP地址、ping】
  • 07-计算机网络协议核心知识|【传输层-UDP】
  • 08-计算机网络协议核心知识|【传输层-TCP之可靠传输】
  • 09-计算机网络核心知识|传输层TCP2【流量控制原理、拥塞控制:slow start、congestion avoidance、快速重传、快速恢复】
  • 10-计算机网络协议核心知识|【传输层-TCP连接】
  • 11-计算机网络协议核心知识|【 应用层】
  • 12-计算机网络核心知识|【Cookie、Session(概念、生命周期、有效期、浏览器的要求等)、跨域(概念、 同源策略、跨域解决方
  • 13-计算机网络协议核心知识|【 代理/CDN/网络安全】
  • 14-计算机网络协议核心知识|【(非)对称加密/数字签名/证书】
  • 15-计算机网络协议核心知识|【HTTPS】
  • 16-计算机网络核心知识|HTTPS协议【HTTP2、HTTP3】

本文主要关注HTTPS:
HTTPS由网景公司于1994年首次提出。HTTPS是在HTTP的基础上使用SSL/TLS来加密报文,对窃听和中间人攻击提供合理的防护。

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

二、HTTPS

1. 什么是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后,所在服务器返回了重定向地址。

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

如果不加协议头,浏览器默认域名使用HTTPS。

HTTPS的成本:证书的费用、加解密的计算等、降低了访问速度。有些企业的做法是:包含敏感数据的请求才使用HTTPS,其他仍让使用HTTP,例如工商银行(www.icbc.com.cn、https://mybank.icb…

2. HTTPS的通信过程

HTTPS的通信过程,总的可以分为3大阶段:

  1. TCP的3次握手
  2. TLS的连接
  3. HTTP请求和响应

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

三、SSL/TLS

TLS(Transport Layer Security),传输层安全性协议。前身是SSL(Secure Sockets Layer),安全套接层。

SSL/TLS也可以用在其他协议上,比如FTP -> FTPSSMTP -> SMTPS

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. OSI

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

SSL/TLS是在应用层和传输层之间,因为SSL是为HTTP的数据包进行加密的,所在必须在数据包到达传输层前介入。

3. OpenSSL

OpenSSL是SSL/TLS协议的开源实现,始于1998年,支持Windows、Mac、Linux等平台。Linux、Mac一般自带OpenSSL,Windows需要下载安装(地址:slproweb.com/products/Wi…

常用命令:

  • 生成私钥:openssl genrsa -out 姓名.key
  • 生成公钥:openssl rsa -in 姓名.key -pubout -out 姓名.pem

可以使用OpenSSL构建一套属于自己的CA,自己给自己颁发证书,称为“自签名证书”。

4. TLS 1.2 的连接

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

大概有10大步骤,图片中省略了中间产生的一些ACK确认。

第一步:Client Hello

  • TLS的版本号 - 支持的加密组件列表(Cipher Suite) - 加密组件是指所使用的加密算法及密钥长度等 - 一个随机数(Client Random

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

第二步:Server Hello

- TLS的版本号 - 选择的加密组件 - 是从接收到的客户端加密组件列表中挑选出来的 - 一个随机数(Server Random

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

第三步:Certificate

- 服务器的公钥证书(被CA签名过的)

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

第四步:Server Key Exchange

- 用以实现ECDHE算法的其中一个参数(Server Params) - ECDHE是一种密钥交换算法 - 为了防止伪造,Server Params经过了服务器私钥签名

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

第五步:Server Hello Done

- 告知客户端:协商部分结束

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

到第五步为止,客户端和服务器之间都是通过明文共享了:Client Random、Server Random、Server Params。而且客户端也拿到了服务器的公钥证书,接下来客户端会验证证书的真实有效性。

第六步:Client Key Exchange

- 用以实现ECDHE算法的另一个参数(Client Params

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

到目前为止,客户端和服务器都拥有了ECDHE算法需要的2个参数:Server Params、Client Params。此时客户端和服务器都可以使用ECDHE算法,根据Server Params、Client Params计算出一个新的随机密钥串(Pre-master secret)。然后结合Client Random、Server Random、Pre-master secret生成一个主密钥,最后利用主密钥衍生出其他密钥:客户端发送用的会话密钥、服务器发送用的会话密钥等。

第七步:Change Cipher Spec

- 告知服务器:之后的通信会采用计算出来的客户端会话密钥进行加密。

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

第八步:Finished 包含连接至今全部报文的整体校验值(摘要),加密之后(用会话密钥进行加密)发送给服务器。这次握手协商是否成功,要以服务器是否能够正确解密该报文作为判定标准

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

第九步:Change Cipher Spec 服务器通知客户端,可以进行加密通信(服务器使用服务器会话密钥)。

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

第十步:Finished 告知客户端:服务器收到的报文加密后的校验值。

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

到此为止,客户端服务器都验证加密解密没问题,握手正式结束。

开始加密传输:

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

四、Wireshark解密HTTPS

设置环境变量SSLKEYLOGFILE(浏览器会将key信息导出到这个文件)。设置完成后,最好重启一下操作系统。

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

在Wireshark中选择这个文件(编辑 -> 首选项 -> Protocols -> TLS):

15-计算机网络核心知识|HTTPS协议【HTTPS概念、HTTPS同信过程、SSL、TLS、OpenSSL、解密HTTPS、配置服务器HTTPS】

五、配置服务器HTTPS

1. 生成证书

环境:Tomcat9.0.34、JDK1.8.0_251

首先,使用JDK自带的keytool生成证书(一个生成免费证书的网站:freessl.org/)。

命令:keytool -genkeypair -alias daben(别名) -keyalg RSA(密钥算法名称) -keystore /User/Developer/Desktop/daben.jks(输出位置)

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。由于是自签名证书,浏览器会不信任(浏览器会发出不安全警告),但不影响我们学习研究使用。