This repository has been archived on 2023-11-13. You can view files and clone it, but cannot push or open issues or pull requests.
blog/_posts/2022-06-04-https.md
2023-06-03 15:58:09 +08:00

102 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
layout : post
title : "HTTPS的工作原理"
subtitle : "Are your data safe?"
date : 2022-06-04 12:28:20
author : "Manford Fan"
catalog : false
header-img : "img/post-bg-universe.jpg"
tags :
- Https
- SSL
---
httpsHyper Text Transfer Protocol over SecureSocket Layer是在http over tls/ssl的缩写即构建在http协议之上的加密传输协议。https存在一个不同于http的默认端口以及一个加密/身份验证层在http与tcp之间。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯例如交易支付等方面但是随着人们安全意识的增强与ssl证书成本越来越低几乎大部分网站都在用https而且大部分浏览器也将https协议作为默认协议处理。
## 一、为什么要用https
http协议有很多优点比如基于tcp/ip保证了可靠传输只负责收发不记录状态可发送任意格式报文数据灵活可扩展另外http还支持压缩传输分段传输支持国际化语言以及身份认证等。总的来说相对于其他协议http可以很骄傲地说“我不是针对你们任何一个我只是说在座的各位都是垃圾”确实http有这个实力但也不是说它是完美的。至少在安全传输方面http做的并不好因为它使用明文传输的很容易被抓包如果传输的是银行卡密码之类的私密信息被人获取后果更是不堪设想。https针对http的安全性做了如下优化提升
- 通信使用密文通信,内容不可能被窃听
- 证明了报文的完整性,防止第三方篡改
- 验证通信方的身份,拒绝伪装者发送的信息
## 二、https的全过程
https本质是一种带有身份认证的可信传输过程中间涉及非常多的概念比如对称加密非对称加密摘要信息完整性校验数字签名CA权威证书颁发机构证书校验等等这些概念后续都有比较详细的记录现在先看下https的一个完整通信过程
![https](/img/posts/https-overall.png 'https overall')
#### 1. 加密算法
从上图可以看出https协议通信过程中使用了两种加密算法——对称加密和非对称加密。很自然的的一个问题就是为什么非要用两种加密算法只使用其中一个是否可以呢答案是可以可以只使用非对称加密但是代价很高你的CPU可能会抗议
> **对称加密算法**
对称加密算法很好理解以现实生活中的钥匙和锁为例一般情况下一把锁对应唯一一把钥匙。任何人只要拿到钥匙都能打开这把锁其特点是算法公开、计算量小、加密速度快、解密效率高常用的对称加密算法有AES、DES、Blowfish、CAST、IDEA、RC2、RC5等。
应用到https协议信息的传输过程中就是服务器和客户端都使用同一个密钥进行加密和解密的那么就要求通信双方都需要提前获得对称加密的密钥。如果要保证信息传输的安全性我们就需要考虑怎么做到同时只让服务器和客户端知道密钥任何其他设备都不能知道呢这就需要非对称加密算法了
> **非对称加密算法**
非对称加密算法是单向加密算法是密钥对的形式存在一个公钥可以分发给任何人另一个是私钥只能自己保存绝对不可以泄露。公钥和私钥都可以实现加密信息的功能但是如果信息被其中一个密钥加密了就只能使用另一个密钥解密这就是所谓的单项加密。到这里就明白了非对称加密的结论性原理即客户端可以使用公钥进行加密并发送数据给服务器即使数据被截获中间人也无法破解因为只有服务器有对应的私钥。常用的非对称加密算法有RSADSAECC等。
现在看起来很完美屏蔽了中间攻击服务器和客户端可以愉快的安全通信了。但是又出现了其他的问题我怎么确定我拿到的公钥就是服务器给我的会不会是另一个人发给我的假公钥我如果把信息以这个公钥加密并发送出去我的信息就又泄露了。这个时候就需要有个极具公信力人或者机构告诉我们你拿到的证书是真的或者是假的这个就是CA的作用。
#### 2. 摘要信息——Hash
在正式介绍CA之前还有一个概念需要了解那就是摘要。所谓的摘要就是一种哈希算法所谓的哈希算法是一种很神秘的算法它可以将所有的东西转换成唯一的一个字符串只要内容没有变化哈希值就不会发生变化反之哈希值一定会发生变化。所以摘要算法可以作为信息完整性校验的工具判断信息在传输过程中是否被篡改。常用的摘要算法有MD2、MD5、MDC2、SHASHA1和RIPEMD等。
#### 3. 数字签名
了解什么是证书之前还需要了解签名的概念因为证书就是由公钥拥有者的其他信息以及前两者内容的签名构成的。强烈推荐David Youd在1996年写的一篇文章——[What is a Digital Signature?](http://www.youdzone.com/signature.html)。签名的出现是为了解决“怎么证明Bob是Bob”的问题Alice想要请求Bob的一个https网页并收到了Bob的回信回信中附带了一本证书那Alice要怎么验证才能相信这本证书确实是Bob发来的呢救赎之道就是签名。
签名的过程也很简单就是将Bob的一些私人信息比如姓名地址国籍以及有效期等和公钥信息一起做哈希这样就得到了相应的摘要信息然后在用私钥**这里的私钥是上一层CA机构的私钥不要理解成自己的私钥**加密摘要信息得到签名。将签名附在公钥以及个人信息文档中就得到了一个被数字签名的证书。Alice拿到这个被签了名的证书之后再通过校验就能验证这个公钥是不是Bob发来的。
#### 4. 什么是证书
上一小节数字签名中就说过证书就是由公钥拥有者的其他信息以及前两者内容的签名构成的。证书是数字签名是一种身份认证手段它能保证发过来的公钥内容是能和签名对应上的却不能保证一定是真的Bob发过来的。如果要验证这本证书是否真的是Bob发来的还需要使用CA根证书。既然有根证书就有子证书首先粗略了解一下证书的层级
![cert](/img/posts/https-cert.jpg)
从最左边的图片可以看到rustle.cc的证书处于最下面最上一层是根证书Sectigo AAA两者之间的都是中间证书颁发机构。中间以及右面的图片是浏览器内置的中间CA机构证书以及CA根证书。除了根证书之外**所有的证书都是由上一级CA机构颁发的**所以rustle.cc的证书是由上一级CA颁发的上一级CA证书是由它的上一级颁发的以此类推一直到CA根证书CA根证书是自己颁发的而且其私钥是绝对保密的。所有的一切都基于CA根证书是绝对可信也是整个信任链的起始所以说如果某个CA根证书颁发机构的私钥被泄露了那也就意味着整个信任体系的崩塌。
#### 5. CA——权威证书颁发机构
CA认证中心是负责签发管理认证数字证书的机构是基于国际互联网平台建立的一个公正权威可信赖的第三方组织机构。世界上的CA认证中心不止一家他们之间的关系在第四小节也有所介绍可以用如下树状结构来表示
![cert](/img/posts/https-cert-ca.png 'https cert ca')
因为世界上CA机构不止一家所以还有很多如上所示的树状结构。以rustle.cc这个域名为例正常情况下申请证书的流程如下
- step 1: 在服务器生成公私钥密钥对,且要保证私钥只有客户端自己拥有
- step 2: 在服务器端以自身的信息(国家、机构、域名、邮箱,摘要/加密算法等)为输入生成证书请求文件csr
- step 3: csr包括公钥以及信息用指定的摘要算法获得csr的哈希值并用私钥加密得到签名信息
- step 4: 把csr证书请求文件以及签名信息给到CA机构CA会首先校验其签名然后审核客户端的信息
- step 5: 签名以及信息校验没有问题之后CA会使用自己的私钥生成签名并和csr一起生成证书文件下发到客户端
#### 6. 证书校验
至此了解了加密算法摘要数字签名证书以及CA的概念那么回到第三节《数字签名》部分的问题Alice应该怎么确认自己接收到的证书确实是Bob发来的当时说了是使用签名但是第四节《什么是证书》又说签名本身只能保证文件是正确的并不能保证确实是Bob发的也可能是Susan发的只不过用的是Bob的名字而已。要解决这个问题还得回到证书本身的构成我们反复说证书是由公钥信息以及签名构成其中信息中有一些加密算法和摘要算法就是为了验证证书有效性而设计的。
为了更清晰的解释如何验证证书的有效性Bob发来的证书总一般有2级即中间CA证书和Bob的证书。Alice首先用中间证书的公钥去解密签名得到Bob证书公钥和信息的哈希值A1再独单用信息中指定的摘要算法去计算Bob证书的公钥和信息得到哈希值A2对比A1和A2是否相等如果相等则说明Bob的证书确实是由其中间CA证书颁发的然后再验证Bob的中间CA证书的有效性同样用浏览器内置的CA根证书的公钥去解密Bob中间证书的签名会得到中间CA证书的公钥和信息的哈希值B1再用中间证书中指定的摘要算法重新单独计算公钥和信息的摘要得到哈希值B2比较B1和B2是否相等如果相等则证明中间CA证书是可信的。
最后到了浏览器内置的CA根证书我们之前说过信任链的起始位置就是CA根证书绝对可信所以如果验证了Bob发过来的域名证书和中间CA证书都没问题则完全可以说Alice收到的Bob给过来的证书确实是Bob发送的。
## 三、一次https访问完整的抓包过程
划掉如下是用wireshark对https的一次抓包过程不是很完美的地方是始终抓不到服务器给客户端发证书的报文划掉。23年4月13日将域名绑定IP进行访问在IP对应的机器上开启tcpdump抓包拿到完整的过程如下
![wireshark](/img/posts/https-wireshark.png 'wireshark https')
## 四、参考文档
- [什么是数字签名证书?](http://www.youdzone.com/signature.html)
- [数字证书浅析以及如何验证证书的可信/合法性](https://www.cnblogs.com/funny11/p/6978908.html)
- [深入理解HTTPS工作原理](https://juejin.cn/post/6844903830916694030)