为什么需要加密

因为在http传输数据的时候是通过明文传输的,这样如果在中间被一些别有用心的人给截取了,那么信息就不安全了,所以我们需要进行数据加密,首先是对称加密

对称加密

客服端和服务端都持有一个相同的密钥,在进行数据传输的时候使用该密钥进行加密解密,这样数据就是安全的

但是如何保证它们的密钥是相同的呢,难道服务端将密钥生成发送给客户端吗,这样明显是不安全的,在安装浏览器的时候将服务端的密钥一次性储存起来吗,那样明显是不行的,于是就有了非对称加密

非对称加密

有两把密钥,分为公钥和私钥,使用公钥加密的数据只能通过私钥进行解密

服务端生成公钥和私钥,把公钥发送给客户端,客户端使用公钥进行数据加密,然后发送给服务端,服务端使用私钥进行解密,这样看起来是没有什么问题的。

但是从服务器将公钥发送给客户端这一段路上是明文传输的,如果将公钥拦截进行替换,那么客户端也不知道公钥被替换了,所以这样也是不安全的。

如果客户端和服务端都有自己的公钥和私钥呢,模拟一下

  1. 客户端将公钥A给服务端,服务端把公钥B给客户端

  2. 客户端使用公钥B进行数据加密传输给服务端,服务端先判断公钥是否我发布给客户端的,然后进行数据解密。

  3. 服务端也是如此

这样看起来是没有问题了,但是非对称加密是十分耗时的。所以有了非对称和对称加密结合起来的方法。

https采用的非对称加密+对称加密

  1. 服务端把自己的公钥发送给客户端

  2. 客户端生成随机数X,使用公钥进行加密传输给服务端

  3. 服务端使用私钥进行解密获取随机数X,后续使用X进行数据加密和解密

总体上说就是使用非对称加密将一个对称加密要使用的密钥进行传输,这样后续使用对称加密即可

这样看起来是不是没有问题,但是如何保证公钥是服务端发布的呢,这个时候就需要一个可信任的第三方机构,也就是CA机构

CA机构

HTTPS中CA证书的签发及使用过程 - xdyixia - 博客园 (cnblogs.com)

a.服务方S向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;(不交私钥)
b.CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
c.如信息审核通过,CA会向申请者签发认证文件-证书。
证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名;
签名的产生算法:首先,使用散列函数计算公开的明文信息信息摘要,然后,采用CA的私钥对信息摘要进行加密密文即签名;
d.客户端 C 向服务器 S 发出请求时,S 返回证书文件;
e.客户端 C读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
f.客户端然后验证证书相关的域名信息、有效时间等信息;
g.客户端会**内置信任CA的证书信息(包含公钥)**,如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。