定义

HTTPS就是安全的HTTP,我们知道HTTP是运行在TCP层之上的,HTTPS在HTTP层和TCP层之间加了一个SSL层,SSL向上提供加密和解密的服务,对HTTP比较透明,这样也便于服务器和客户端的实现以及升级。
image.png

为什么安全

机密性是指传输的数据是采用Session Key(会话密钥)加密的,在网络上是看不到明文的。

完整性是指为了避免网络中传输的数据被非法篡改,使用MAC算法来保证消息的完整性。

真实性是指通信的对方是可信的,利用了PKI(Public Key Infrastructure 即『公钥基础设施』)来保证公钥的真实性。

不可否认性是这个消息就是你给我发的,无法伪装和否认,是因为使用了签名的技术来保证的。

原理

概述

SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
但是,这里有两个问题。
(1)如何保证公钥不被篡改?
解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。
(2)公钥加密计算量太大,如何减少耗用的时间?
解决方法:每一次对话(session),客户端和服务器端都生成一个”对话密钥”(session key),用它来加密信息。由于”对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密”对话密钥”本身,这样就减少了加密运算的消耗时间。
因此,SSL/TLS协议的基本过程是这样的:
(1) 客户端向服务器端索要并验证公钥。
(2) 双方协商生成”对话密钥”。
(3) 双方采用”对话密钥”进行加密通信。
上面过程的前两步,又称为”握手阶段”(handshake)。第三步称为“通信阶段”

握手阶段的详细过程

HTTPS详细过程 - 图3

image.png
image.png
“握手阶段”涉及四次通信,我们一个个来看。需要注意的是,”握手阶段”的所有通信都是明文的

1、浏览器发出请求(ClientHello)
HTTPS详细过程 - 图6HTTPS详细过程 - 图7
在这一步,客户端主要向服务器提供以下信息。
(1) 支持的协议版本,比如TLS 1.0版。
HTTPS详细过程 - 图8HTTPS详细过程 - 图9
(2) 一个客户端生成的随机数,稍后用于生成”对话密钥”。
HTTPS详细过程 - 图10HTTPS详细过程 - 图11
(3) 支持的加密方法,比如RSA公钥加密。
HTTPS详细过程 - 图12HTTPS详细过程 - 图13
(4) 支持的压缩方法。
HTTPS详细过程 - 图14HTTPS详细过程 - 图15
这里需要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,否则会分不清应该向客户端提供哪一个网站的数字证书。这就是为什么通常一台服务器只能有一张数字证书的原因。
对于虚拟主机的用户来说,这当然很不方便。2006年,TLS协议加入了一个Server Name Indication扩展,允许客户端向服务器提供它所请求的域名。
4.2 服务器回应(SeverHello)
HTTPS详细过程 - 图16HTTPS详细过程 - 图17
服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容。
(1) 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
HTTPS详细过程 - 图18HTTPS详细过程 - 图19
(2) 一个服务器生成的随机数,稍后用于生成”对话密钥”。
HTTPS详细过程 - 图20HTTPS详细过程 - 图21
(3) 确认使用的加密方法,比如RSA公钥加密。
HTTPS详细过程 - 图22HTTPS详细过程 - 图23
(4) 服务器证书。
除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供”客户端证书”。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。
4.3 客户端回应
客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。
(1) 一个随机数。该随机数用服务器公钥加密,防止被窃听。
(2) 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(3) 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称”pre-master key”。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把”会话密钥”。
至于为什么一定要用三个随机数,来生成”会话密钥”,dog250解释得很好:
“不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。
对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。
pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。”
此外,如果前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息。
4.4 服务器的最后回应
服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的”会话密钥”。然后,向客户端最后发送下面信息。
(1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用”会话密钥”加密内容。
握手阶段有三点需要注意。
(1)生成对话密钥一共需要三个随机数。
(2)握手之后的对话使用”对话密钥”加密(对称加密),服务器的公钥和私钥只用于加密和解密”对话密钥”(非对称加密),无其他作用。
(3)服务器公钥放在服务器的数字证书之中。

https详细过程

HTTPS详细过程 - 图24HTTPS详细过程 - 图25
1、浏览器输入https://baidu.com,发起请求
(1) 声明浏览器支持的协议版本,比如TLS 1.0版。
(2) 生成一个随机数 random1发送给服务器,稍后用于生成”对话密钥”。
(3) 声明浏览器支持的加密方法,比如RSA公钥加密。
(4) 声明浏览器支持的压缩方法。比如gzip
2、服务器收到请求,然后响应
(1) 确认协议版本,比如TLS 1.0版本。如果服务器不支持浏览器声明的协议版本,则服务器关闭连接。(2) 生成一个随机数random2发送给浏览器,稍后用于生成”对话密钥”。(3) 确认使用的加密方法,比如RSA公钥加密。(4) 将网站证书发送给浏览器。(即你在阿里云购买的证书,也即nginx配置文件中的 ssl_certificate “/etc/nginx/cert/www.pem”)
3、浏览器收到服务器发过来的网站证书(点击网址栏的🔒查看)
(1)先验证证书上的签名。因为CA机构在给你签发网站证书的时候,用自己的CA私钥对证书进行了签名,证书里的签名算法字段 sha256RSA(如下图1) 表示,CA机构使用sha256算法对证书进行摘要,然后再使用RSA算法对摘要进行私钥签名,而我们也知道RSA算法中,使用私钥签名之后,只有公钥才能进行验签。而CA机构的公钥一般都已预置在浏览器(如下图2)中了,这样浏览器就可以使用预置的CA机构公钥对网站证书进行验签。验签之后可以看到CA机构使用sha256得到的证书摘要。 然后浏览器自己使用sha256对证书内容进行摘要,如果得到的值和验签之后得到的摘要值相同,则表示证书没有被修改过。如果没有找到内置的CA机构公钥,此时就会提示用户该证书是不是由权威机构颁发,是不可信任的。
HTTPS详细过程 - 图26HTTPS详细过程 - 图27
HTTPS详细过程 - 图28HTTPS详细过程 - 图29
(2)签名通过后,浏览器验证证书记录的网址是否和当前网址是一致的,不一致会提示用户。如果网址一致会检查证书有效期,证书过期了也会提示用户。这些都通过认证时,浏览器就可以安全使用证书中的网站公钥了。如果验证通过,就会网址栏就会显示安全字样,如果你购买的网站证书是更高级的EV类型,就会显示出购买证书的时候提供的企业名称。如果没有验证通过,就会显示不安全的提示。

HTTPS详细过程 - 图30HTTPS详细过程 - 图31

(3)说明: 除了浏览器有内置的CA公钥以外,操作系统也有预置的CA公钥,windows10下运行certmgr.msc
HTTPS详细过程 - 图32HTTPS详细过程 - 图33
(2)验证通过之后,浏览器会生成一个随机数pre-master secret,然后使用证书中的公钥(如下图)进行加密,然后发送给服务器
HTTPS详细过程 - 图34HTTPS详细过程 - 图35
4、服务器收到浏览器发送过来的pre-master secret
(1) 服务器使用私钥(ssl_certificate_key “/etc/nginx/cert/www.key”)解密之后获得随机数pre-master secret,然后random1、random2、pre-master secret通过一定的算法得出session Key和MAC算法秘钥,作为后面交互过程中使用对称秘钥。同时浏览器也会使用radom1、radom2、pre-master secret,和同样的算法生成session Key和MAC算法的秘钥。
(2)生成session Key的算法叫做PRF算法(Pseudorandom Function伪随机方法)。这里不展开。
5、然后再后续的交互中就使用session Key(对话密钥)和MAC算法的秘钥对传输的内容进行加密和解密。
(1)具体的步骤是先使用MAC秘钥对内容进行摘要,然后把摘要放在内容的后面使用session Key再进行加密。
(2)再具体的。。搞不懂了

流程图

HTTPS详细过程 - 图36HTTPS详细过程 - 图37

上面说的只是单向验证,那双向验证是怎么回事?

页面加载流程

image.png

参考

https://zhuanlan.zhihu.com/p/27250898
https://zhuanlan.zhihu.com/p/37470224