- HTTP存在的问题
- HTTPS的实质
HTTP存在的问题
- 信息是明文传输,内容可能被窃取
- 不验证对方身份,身份可能是伪装的
- 不验证报文完整性
HTTPS的实质
HTTPS的实质就是,HTTP加上
加密处理、认证机制和完整性保护。加密处理、认证机制和完整性保护合起来就是SSL协议。所以HTTPS也是HTTP+SSL
HTTPS的加密原理
加密分为对称加密和非对称加密,HTTPS两者都使用。加密使用秘钥进行,秘钥分为私钥和公钥。公钥一般用来加密,私钥用来签名。
秘钥就是加密或者解密的方法的一个参数。比如加密算法是明文加上1,那个这个1就是秘钥,秘钥也可能是2,3等其他的。
对称加密
同一个秘钥可以做加密也可以做解密的这种加密形式叫做对称加密。服务器加密的时候,会将秘钥发送给客户端,让客户端能够解密。但是这个秘钥可能会被劫持,那么别人也能够加密,所以是不安全的
非对称加密
加密解密的时候使用不同的秘钥的加密方式叫做非对称加密。一般公钥加密,私钥解密(但是有说法是私钥用来签名,这怎么解释)。传输过程如下。服务器为S,客户端为C。两者都可公钥(s_pub,c_pub)私钥(s_pri,c_pri)
s发送数据给m
- s使用s的秘钥s_pri对m进行签名处理,得到摘要m1
- s使用c的公钥c_pub对m1进行加密,得到m2,并发给c c接受到m2
- c使用自身的私钥pri,对m2解密,得到摘要m1
- c在使用s的公钥s_pub对m1解签,得到m 公钥可以公开任何人都知道,私钥只有自己知道。私钥公钥的关系相当于,钥匙和保险柜,A把自己的公钥交给B,就相当于把保险柜交给B,B用公钥加密就相当于,往保险柜里放东西,发送数据就是把保险柜发送给A,私钥解密,就是用钥匙把保险柜打开,就能获取B发送给A的数据。因为这个保险柜的钥匙只要A有,所以是绝对安全的
HTTPS的数据传输过程
https的SSL使用对称加密和非对称加密的组合形式
- 先执行非对称加密:当客户端第一次发请求和服务器协商的时候,服务器就生成了一对公钥(pub)和私钥(pri),服务器会将公钥pub发送给客户端,客户端接收到pub,生成一个秘钥key,然后使用pub对key加密,发送给服务器,服务器使用pri对数据解密获取key。这个key就是对称加密的时候使用的秘钥。
对称加密的缺点就是秘钥可能被其他人获取,如果使用非对称加密传输对称加密的秘钥,这样对称加密的秘钥就不会被其他人知道了 - 对称加密:这时,客户端,服务端都有相同的秘钥key。执行数据通讯的时候,就使用对称加密
为什么https使用这种混合的方式呢,对称加密和非对称加密各有优缺点,对称加密简单,但是秘钥可能被被人知道,给对称加密安全,但是复杂,有很多算法,消耗大量资源,速度回大大降低。所以采用这种两者结合的方式
验证身份
参考文档 HTTPS执行非对称加密的时候,服务器会将自己的公钥给到客户端,如果此时公钥是中间人的,那么后续的通讯中间人都可以获取到数据。所以要对公钥的身份进行验证
数字证书由数字证书认证机构(Certificate Authority,简称CA)其中中包含了Server的公钥,机构信息,还包括了证书内容的数字签名、签名计算方法、证书对应的域名
Server的公钥、其他信息通过HASH函数计算得到证书的数字摘要,权威机构的私钥加密得到数字签名。
数字证书的生成
- Server把自己的公钥、域名等信息发送给CA
- CA拿到后用自己的私钥进行加密
- 权威自己用自己的私钥进行加密了, 那应该如何解密?你发送给Client,中间人不是一样可以劫持吗?。鸡生蛋,蛋生鸡的悖论了。
- 答案是权威机构的公钥不需要传输,因为权威机构会跟主流的浏览器或操作系统合作,将他们的公钥内置到浏览器或操作系统环境中。
- Client收到数字证书后,从数字证书中找到权威机构的信息,从本地找到权威机构的公钥,就能正确解密Server的公钥
数字证书的验证
服务器将数字证书发送给客户端,客户端拿到本地找到权威机构的公钥,解密数字证书,得到Server的公钥,机构信息,还包括了证书内容的数字签名A、签名计算方法、证书对应的域名。然后对信息重新计算签名(签名应该是对应证书上的所有信息,包括签名计算方法、证书对应的域名)得到签名B, 对比A和B,如果相同那么内容没有修改,公钥可以使用
数字证书加密使用非对称加密,但是与一般的幽幽不一样的地方。一般是使用对方的公钥加密,自己私钥解密。但是证书是使用自己的私钥加密,客户端使用证书的私钥解密。因为证书只是为了证明信息的正确性,并不会是为了防止信心的内容被中间人查看到。证书的内容基本都可看到
有以下两种假设
- 如果中间人将证书替换成自己的证书是否有效呢,因为证书上面有改证书对应的域名,客户端对比一下请求的域名,就可以知道证书书否有效。
- 如果中间人修改了证书数据,但是其不知道CA的私钥,不能对修改后的数据加密,如果随便使用一个私钥加密,客户端使用CA公钥无法进行解密。