(1) 窃听风险:黑客可以获知通信内容。
(2) 篡改风险:黑客可以修改通信内容。
(3) 冒充风险:黑客可以冒充他人身份参与通信。
HTTPS 并非是应用层的一种新的协议。只是HTTP通信接口部分用 SSL 或 TLS 协议代替而已。也就是说,所谓的 HTTPS,**其实就是身披 SSL协议外壳的 HTTP。**SSL 是独立于 HTTP 协议的,也就是说其他运行在应用层的协议均可配合 SSL 协议使用。HTTPS 中使用了 SSL 和 TLS 这两个协议。TLS 是以 SSL 为原型开发的协议,有时候会统称该协议为 SSL。
随着 TLS 的发展,DTLS 也开始出现,就是同样的 TLS 逻辑被应用于 UDP 业务之上。
HTTPS 在加密过程中使用了 **非对称加密技术 **和 对称加密技术。
- 证书的发布机构 CA
- 证书的有效期
- 公钥
- 证书所有者
- 签名
- ...
- 首先浏览器读取证书中的证书所有者、有效期等信息进行一一校验
- 浏览器开始查找操作系统中已内置的受信任的证书发布机构 CA,与服务器发来的证书中的颁发者 CA 比对,用于校验证书是否为合法机构颁发
- 如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的
- 如果找到,那么浏览器就会从操作系统中取出 颁发者 CA 的公钥,然后对服务器发来的证书里面的签名进行解密
- 浏览器使用相同的 hash 算法计算出服务器发来的证书的 hash 值,将这个计算的 hash 值与证书中签名做对比
- 对比结果一致,则证明服务器发来的证书合法,没有被冒充
- 此时浏览器就可以读取证书中的公钥,用于后续加密了
要想知道某个 CA 的证书是否可靠,要看 CA 的上级证书的公钥,能不能解开这个 CA 的签名。就像你不相信区公安局,可以打电话问市公安局,让市公安局确认区公安局的合法性。这样层层上去,直到全球皆知的几个著名大 CA,称为 root CA,做最后的背书。通过这种 层层授信背书 的方式,从而保证了非对称加密模式的正常运转。
HTTPS 中不仅可以使用服务器证书,还可以使用客户端证书。以客户端证书进行客户端认证,它的作用与服务器证书是相同的。由于客户端获取证书需要用户自行安装客户端证书,同时也面临着费用的问题。因此,现状是,安全性极高的认证机构可颁发客户端证书但是仅用于特殊用途的业务。比如那些可支撑客户端证书支出费用的业务。
例如,银行的网上银行就采用了客户端证书。在登录网银时不仅要求用户确认输入 ID 和密码,还会要求用户的客户端证书,以确认用户是否从特定的终端访问网银。
公钥私钥主要用于传输对称加密的秘钥,而真正的双方大数据量的通信都是通过对称加密进行的。这就是 HTTPS 协议的总体思路。
1、客户端会发送 Client Hello 消息到服务器,以明文传输 TLS 版本信息、加密套件候选列表、压缩算法候选列表等信息。另外,还会有一个随机数,在协商对称密钥的时候使用。
2、服务端发回 Server Hello 消息, 告诉客户端,服务器选择使用的协议版本、加密套件、压缩算法等,还有一个随机数,用于后续的密钥协商。
3、随后服务端发给客户端证书,供客户端审核,审核步骤就是上边阐述的逻辑。
4、证书验证成功之后,客户端计算产生随机数字 Pre-master,发送 Client Key Exchange,用证书中的公钥加密,再发送给服务器,服务器可以通过私钥解密出来。
到目前为止,无论是客户端还是服务器,都有了三个随机数,分别是:自己的、对端的,以及刚生成的 Pre-Master 随机数。通过这三个随机数,可以在客户端和服务器产生相同的对称密钥。
5、之后客户端再发送给服务端 Change Cipher Spec,表明以后都采用协商的通信密钥和加密算法进行加密通信了。
6、然后发送一个 Encrypted Handshake Message,将已经商定好的参数等,采用协商密钥进行加密,发送给服务器用于数据与握手验证。
7、服务器也可以发送 Change Cipher Spec,说:“没问题,咱们以后都采用协商的通信密钥和加密算法进行加密通信了”,并且也发送 Encrypted Handshake Message 的消息试试。当双方握手结束之后,就可以通过对称密钥进行加密传输了。
上面的过程只包含了 HTTPS 的单向认证,也即客户端验证服务端的证书,是大部分的场景,也可以在更加严格安全要求的情况下,启用双向认证,双方互相验证证书。
SSL(安全套接字层)是一种标准的安全技术,用于在服务器和客户端之间建立加密连接。安装 SSL 证书后,就可以建立此安全连接。
非对称加密(或公钥加密)使用单独的密钥进行加密和解密。任何人都可以使用加密密钥(公钥)来加密消息。但是,解密密钥(私钥)是秘密的。这样,只有预期的接收者才能解密该消息。最常见的非对称加密算法是 RSA。
非对称密钥通常为 2048 位,小于 2048 位的密钥不再被认为是安全的。2048 位密钥有足够的唯一加密代码,虽然可以创建更大的密钥,但是会增加计算负担。而且,破解 2048 位的证书需要超过 140 亿年的普通计算机。
对称加密(或预共享密钥加密)使用单个密钥来加密和解密数据。发送方和接收方都需要相同的密钥才能进行通信。也就是说公钥加密后的密文只能通过对应的私钥来解密,而私钥加密的密文却可以通过对应的公钥来解密。
对称密钥大小通常为 128 或 256 位,密钥大小越大,密钥越难破解。是使用 128 位还是 256 位密钥取决于服务器和客户端软件的加密功能。SSL 证书不指定使用的密钥大小。
这要从 HTTP 向 HTTPS 演化的过程说起。
但是存在缺点如下:
- 不同的客户端、服务器数量庞大,所以双方都需要维护大量的密钥,维护成本很高
- 因每个客户端、服务器的安全级别不同,密钥极易泄露
同样存在缺点:
公钥是公开的(也就是黑客也会有公钥),所以第 ④ 步私钥加密的信息,如果被黑客截获,其可以使用公钥进行解密,获取其中的内容
先利用非对称加密方式,客户端使用公钥加密告诉服务端后续会话采用对称加密,并给服务端传输对称加密的算法和对称密钥,服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后。
但是问题同样存在:
- 客户端如何获得公钥
- 如何确认服务器是真实的而不是黑客
1、提供一个下载公钥的地址,回话前让客户端去下载。(缺点:下载地址有可能是假的;客户端每次在回话前都先去下载公钥也很麻烦)
2、会话开始时,服务器把公钥发给客户端(缺点:黑客冒充服务器,发送给客户端假的公钥)
那有木有一种方式既可以安全的获取公钥,又能防止黑客冒充呢? 那就需要用到终极武器了:SSL 证书。BINGO!!!