当用户点击浏览器地址栏(以下简称客户端)时(这是我的个人博客,前段时间被攻击本地连接收不到数据包,最后直接重置服务器(别问我为什么没有备份,我也是不知道为什么),我还没来得及重建,你可以期待一下,然后你会找到时间回去~),浏览器转到DNS服务器获取到这个url对应的ip本地连接收不到数据包,然后客户端连接到服务器的443端口,向服务器发送这个请求,同时客户端会把它支持的加密算法带到服务器;
二、服务器发送证书
在说这一段之前,插入一个小知识点:用私钥加密的密文只能用公钥解密;用公钥加密的密文只能用私钥解密。
服务器收到加密算法后,会与自己支持的加密算法进行比较(即与自己的私钥进行比较)。如果不匹配,则会断开连接;如果匹配,则服务器向客户端发送SSL证书,其中包括数字证书的内容:1、Certificate Authority;2、Using Authority;3、Public Key;4、有效期;5、签名算法;6、指纹算法;7、指纹。
服务器发送的东西用私钥加密,公钥可以解锁。不保证发送的数据包不会被别人看到,所以后续流程会和客户端商量 选择对称加密(只能用私钥解锁,详情请看非对称和对称加密和解密相关问题)来加密传输的数据。
三、客户端验证服务器发送的证书
1、验证证书
客户端验证收到的证书,包括发证机构是否合法、过期、证书中包含的URL是否与当前访问URL一致等
2、生成一个随机数(这个随机数是后面用到的对称加密的私钥)
客户端验证证书正确(或接受不可信证书)后,会生成一个随机数,并使用服务器发送的公钥进行加密。这样,只有服务器的私钥才能解锁随机数。
3、生成握手信息
使用证书中的签名哈希算法得到握手信息的哈希值,然后用生成的随机数组合【握手信息和握手信息】。 hash value] 进行加密,然后用公钥加密随机数,并一起发送到服务器。计算握手信息的hash值的目的是为了保证发回服务器的握手信息没有被篡改。
四、服务器接收到随机数加密信息,对随机数进行解密,验证握手信息是否被篡改。
服务器收到客户端发回的用随机数加密的信息后,先用私钥解密随机数,再用解密后的随机数解密握手信息,得到握手信息和握手信息。哈希值,计算自己发送的握手信息的哈希值,与客户端返回的进行比较。
如果验证无误,握手信息和握手信息的哈希值也用随机字符串加密后发送回客户端。
五、客户端验证服务器发回的数据握手信息,完成握手
客户端收到服务器发送的握手信息后,用自己生成的随机数解密,并验证随机数加密后的握手信息和握手信息的哈希值。
验证无误后,握手过程完成。从此,服务器和客户端开始使用那串随机数进行对称加密通信(常用的对称加密算法是AES)。
关于nginx正向代理https,可以阅读这里:NGINX正向代理HTTPS
具体的连接过程我又做了一张图,如下,见官方大师,你小心,你小心~
本人知之甚少,本文如有错误请指正,谢谢~
p>