## SSL/TLS
HTTP使用明文传输,明文传输主要有一下三大风险:
- 窃听风险
- 篡改风险
- 冒充风险
SSL/TLS协议就是为了解决这三大风险而设计的,它可以达到如下的效果:
- 所有信息都是加密传输,第三方无法窃听
- 具有校验机制,一旦被篡改,通信双方会立即发现
- 配备身份证书,放置身份被冒充
SSL/TLS协议的基本思想就是采用公钥加密算法。基本过程就是client先向server索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
这里有几个问题:
1. 如何保证client收到的server的公钥不是冒充的?使用CA服务器。
2. 非对称加密计算量大的问题?每一次对话,client和server都会生成一个对称加密的密钥,它用于加密信息,对称加密的速度非常快。而服务器的公钥只用于加密那个对称加密密钥。
3. client没有将client的公钥传给server,如果server想向client用非对称加密的方式传递信息,那么server只能用server的私钥给信息加密,然后client用server的公钥解开。而公钥是server分发给所有人的,这样显然很容易就会发生信息被窃取的情况。需要避免server用server的私钥加密信息的情况。
## SSL/TLS过程
1. client向server发出加密通信的请求,其中client会生成一个随机数,稍后用于生成加密信息的对称密钥。
2. server收到client请求之后,向client发出回应。server回应的内容包括server的证书、一个server生成的随机数(稍后用于生成加密信息的对称密钥)等。
3. client收到server发的信息之后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。如果证书没有问题,client就会从证书中取出server的公钥。然后生成一个随机数作为对称密钥,用server的公钥加密该对称密钥。
4. server收到client发送的密文后,用私钥解开,得到对称加密的密钥。至此整个握手阶段全部结束。client和server使用对称密钥加密内容进行通信。
需要注意的是,SSL/TLS握手阶段都是使用的明文传输。
## HTTPS
HTTPS实际上就是使用上面SSL/TLS握手,然后用对称密钥加密传输之前HTTP传输的明文内容。
## 数字签名
数字签名的作用主要是为了防止内容被篡改。
比如SSL/TLS握手阶段,server将自己的公钥发送给client这个过程是明文传输,存在被第三方篡改的风险。
数字签名的过程是先将内容用hash算法生成摘要,然后使用一个私钥对摘要进行加密生成数字签名,然后将数字签名贴在内容的后面。接收方收到内容后,要验证内容是否被篡改,只需要将数字签名用公钥解密,然后和内容hash之后的结果进行对比,如果不一致,一定发生了篡改。
## CA&数字证书
CA(证书中心)的作用就是给server颁发数字证书,确认server的公钥是可信的,防止第三方冒充。
server的数字证书:server的公钥等信息+CA的数字签名。
server将自己的公钥等信息交给CA,CA将信息hash之后用自己的私钥加密生成CA的数字签名,然后server的公钥等信息和CA的数字签名一起封装成数字证书颁发给server,之后server就使用CA为其颁发的数字证书。client在接受到信息之后,只需要用CA的公钥验证一下CA的数字签名即可知道server的公钥等信息是否被篡改过。这里为了简化模型,可以认为client上的CA公钥一定是可信的。只要client在SSL/TLS握手阶段获得的server公钥是可信的,中间人是没有机会窃取、篡改、冒充的。
## 总结
什么时候用公钥加密信息?什么时候用私钥加密信息?
加密信息:公钥加密,私钥解密。内容不希望被别人看到。
签名:私钥签名,公钥验证。让对方知道是我的发的,不希望被别人冒充、篡改。