嚼一嚼HTTPS
1、什么是HTTP
以下内容来自《How Tomcat Works》
HTTP 是一种协议,允许 web 服务器和浏览器通过互联网进行来发送和接受数据。它是一种
请求和响应协议。客户端请求一个文件而服务器响应请求。HTTP 使用可靠的 TCP 连接,TCP 默认使用 80 端口。
一个 HTTP 请求包括三个组成部分:
- 方法—统一资源标识符(URI)—协议/版本:如 POST /examples/default.jsp HTTP/1.1
- 请求的头部:如 Content-Type: application/x-www-form-urlencoded
- 主体内容:如 lastName=Franks&firstName=Michael
一个 HTTP 响应也包括三个组成部分:
- 方法—统一资源标识符(URI)—协议/版本:如 HTTP/1.1 200 OK
- 响应的头部:如 Content-Type: text/html
- 主体内容:如
<html><title>hello world</title></html>
2、为什么需要HTTPS
以下内容来自《图解HTTP》
HTTP与1990年问世,那时HTTP并没有作为正式的标准被建立,因此被称为HTTP/0.9,含有HTTP1.0版本之前的意思。HTTP在1996年的5月作为正式版本公布,被命名为HTTP/1.0,1997年1月公布的HTTP/1.1是后来主流的HTTP协议版本。虽然HTTP一直驻足不前,但是时至今日,HTTP/1.1仍是互联网中使用最广泛的协议之一。
虽然使用广泛,但是HTTP的缺点也很多:
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
为了解决上述问题,在HTTP的基础上,加上加密处理、证书认证以及完整性保护,形成了现在的HTTPS。
3、HTTPS的使用介绍
假设我们现在有客户端(C端)和服务端(S端),下面介绍C端和S端使用HTTPS通信的流程。
- S端将自己的公钥 sPubKey 发送给 CA 机构,CA 用自己的私钥 cPriKey 对 S 端的信息(包括站点信息和sPubKey)进行加密,形成S端的证书
- CA 机构是一些大机构,被浏览器开发商所承认,浏览器开发商会将 cPubKey 内置到自己开发的浏览器中
- 当 C 端与 S 端通信的时候,第一步 C 端是请求 S 端的公钥,S 端将证书返回给 C 端
- C 端拿到 CA 机构 cPriKey 加密过的证书,用浏览器内置的 cPubKey 解密,取得 S 端的 sPubKey
- C 端用公钥 sPubKey 加密对称加密秘钥 cKey,发送给 S 端,S 端收到后使用私钥 sPriKey 解密,取得 cKey
- 后续 C 端和 S 端通信,都通过 cKey 进行对称加密
4、概念解释
其实看到 3 基本就能回忆起 HTTPS 请求到底是怎么回事,但是对于之前完全不了解 HTTPS 的人来说,可能有些不明白的地方,下面就简单讲述一下。
HTTPS 涉及的加密有两种,一种非对称加密,一种对称加密:
- 非对称加密:加解密使用不同秘钥,公钥公开,但是公钥无法反推私钥,所以更安全。但是加解密耗时更长,适合对少量数据使用
- 对称加密:加解密使用同样的秘钥,秘钥被截获则传输的信息也将被破解,安全性较低。但是速度更快,适合加密内容
HTTPS 将两者结合起来使用,先使用更为安全的非对称加密(RSA)对随机生成的对称加密(AES)秘钥进行加密,传递给对方以后,后续内容传输使用对称加解密。既保证了效率,也提高了安全性。
- 非对称加密传输秘钥,安全性高
- 对称加密的秘钥不易被截获,且是随机生成的,不易破解
既然上述两种加密方式已经可以满足 HTTPS 了,为什么还需要 CA 机构呢?
因为如果最开始 C 端获取 S 端的公钥 sPubKey 时,中途被拦截,传回来的是 xxxPubKey,那么后续的通信都将被 xxx 端截获。故保证第一次获取的公钥确实是来自 S 端,尤为重要。
于是便有了浏览器内置 CA 公钥 cPubKey,此时是可信的。CA 公钥解密证书,获取 S 端的公钥 sPubKey,此时也可信。但是你可能会问,如果 CA 公钥不可信了怎么办?这就相当于国家给你开假身份证,那就没办法了,这种事出现过一次,曾经有一家 CA 机构被黑客入侵。这种事我只能说,就当做没发生过吧。