写在前面
参考
https连接的前几毫秒发生了什么
HTTP与HTTPS的区别
HTTPS概念
HTTPS = HTTP + TLS
使用TLS对数据进行加密,但是数据传输依旧使用的是TCP。因此HTTPS作用有二:一是保护数据安全,二是通过证书验证网站的真实性。
HTTPS主要解决的问题是中间人攻击,中间人攻击一是可以窃取连接过程中的数据并篡改,二是可以欺骗客户端将数据包发往中间人处。
有了HTTPS可以很好地解决这个问题:可以通过证书验证网站的可信度并且对数据进行加密防止被篡改。
HTTP与HTTPS的区别
- https需要证书,可以自己制作或者购买。自己制作的没有得到验证将会跳出弹窗请求用户允许。
- http数据是明文传输的,https则是加密传输。
- http端口为80,https为443。
HTTPS工作原理
https的连接有几个过程,下面一一说明。
客户端发起HTTPS请求
浏览器会给服务器发送一个包,主要有以下信息:
TLS版本:主要说明客户端使用TLS的版本号
随机字符串: 用于之后的密钥对生成
sessionId: 会话id,第一次连接时为0。之后可以通过这个sessionId进行重新连接而不需要进行握手阶段。
浏览器支持的所有加密方式: 发送给服务器让其选择一个加密方式,之后按照这个加密方式给数据进行加密。
域名信息: 虽然握手阶段是在传输层的,但是获取相应证书需要发送域名信息。
服务端回应(Server Hello)
这个包会发送到客户端,里面的内容和上面客户端发送包的内容差不多。
sessionId: 服务端发送给客户端设置其sessionId。
随机字符串: 用于之后的密钥生成。
服务端选择的加密方式: 上面有提到客户端会发送一系列加密方式给服务端选择,服务端会将其选择返回给服务端。
服务端发送证书
随后服务端会发送证书给客户端,证书不一定是一份,而且很有可能是多份。每一份证书和上级证书都有依赖关系,这样只需要验证最上级证书的可靠性就可以保证下级证书的可靠性。
证书有以下内容:
- 签名:表示证书的依赖关系。如果验证了签名正确,那么就可以验证下级证书的正确性。签名是服务端用密钥与tbsCertificate加密得到的一个字符串。
- 签名算法
- tbsCertificate(to be signed Certificate): 包含申请证书时的国家、地区、城市、证书支持的域名、申请时间以及过期时间等。最重要的是证书的公钥。
这里主要说一下签名的用处,签名主要是用来检验证书是否被篡改过的。
主要的方式是 1. 客户端会使用穿过来的公钥对签名进行解密,得到一个hash值。2. 计算tbsCertificate的DER编码值的hash值。 3. 对比二者的hash值,若相同表示没有被篡改过。
进行密钥交换
上面说过服务器会选择一个加密方式比如
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
其中这表示服务器选中的密钥交换加密方式为RSA
,数据传输加密方式为AES
,检验数据是否合法的算法为SHA256
.
密钥交换的过程是这样的:
- 服务端传来一个包包含它的公钥。
- 客户端使用上面服务端传来的随机值和这个公钥进行加密,生成自己的密钥对。
- 发送自己的公钥给服务端。
RSA:
(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
(2)甲方获取乙方的公钥,然后用它对信息加密。
(3)乙方得到加密后的信息,用私钥解密。
所以此时双方都拥有对方的公钥,可以使用这个进行加密,对方再用私钥进行解密。
进行数据传输
交换完密钥后,服务端会发送一个明文包给客户端表示可以其已经准备好传输了,客户端也会发送一个这样的包表示自己准备好了。然后客户端就可以开始进行数据传输了。
缺点
说了这么多,难道HTTPS没有缺点吗?
- 建立https需要花费时间(~0.3s)
- 数据需要加密和解密,占用更多的cpu
- 数据加密后比原信息更大,占用更多的带宽