Https 和 http 区别
区别
可以先用一个简单的比喻来概括:HTTP通信就像是寄一张明信片,内容是公开的,在投递过程中的任何人都可能看到;而HTTPS通信则像把信件放进一个用强力胶水封好的、上了锁的保险箱里进行邮寄,只有拥有钥匙的收件人才能打开。
它们的主要区别体现在以下几个方面:
-
安全性(Security):这是最核心的区别。
- HTTP(HyperText Transfer Protocol)是超文本传输协议,它以明文方式传输数据,不提供任何形式的加密。这意味着在传输过程中的任何环节(如路由器、ISP等),数据都可能被窃听、篡改或冒充,俗称“裸奔”。
- HTTPS(HTTP Secure)可以理解为是HTTP的安全版。它在HTTP之下、TCP之上,增加了一个SSL/TLS安全层。所有HTTP的报文在发送前都会经过这个安全层的加密,从而保证了数据传输的机密性、完整性和身份认证。
-
连接方式与端口:
- HTTP使用标准的80端口。
- HTTPS使用标准的443端口。
-
资源消耗与性能:
- HTTP:协议本身开销小,连接简单快捷。
- HTTPS:需要进行TLS握手过程,这个过程涉及到多次网络往返和非对称加解密计算,因此会消耗更多的服务器资源和带来一定的连接延迟。不过,随着硬件性能的提升和HTTP/2等协议的普及(HTTP/2通常强制要求使用HTTPS),这个性能差距已经变得很小,甚至在某些情况下,HTTPS的性能会因为协议优化而反超HTTP。
-
证书要求:
- HTTP不需要任何证书。
- HTTPS必须使用由受信任的证书颁发机构(CA, Certificate Authority)签发的数字证书。这个证书用来证明服务器的身份,并包含了用于加密的公钥。申请和维护证书需要一定的成本。
HTTPS加密的实现
HTTPS的安全保障完全依赖于其底层的TLS/SSL协议。这个协议的核心目标是安全地协商出一个对称加密密钥,然后用这个密钥来加密后续的HTTP通信内容。
为什么不直接用非对称加密?因为非对称加密的计算开销非常大,性能很差,只适合用来加密少量关键数据(比如密钥本身),而不适合加密大量的业务数据。而对称加密速度快,性能好,适合加密业务数据。
所以,HTTPS的实现原理可以概括为:用非对称加密来安全地交换对称加密的密钥,然后用对称加密来高效地加密通信内容。
这个过程主要通过TLS握手(Handshake)来完成,下面是一个简化的、核心的握手步骤:
-
客户端发起请求 (Client Hello)
- 浏览器(客户端)向服务器的443端口发起请求。
- 请求中包含了它支持的TLS版本、一个客户端生成的随机数(
client_random),以及它支持的密码套件(Cipher Suite)列表。密码套件是指加密算法的组合,如加密算法、密钥交换算法、哈希算法等。
-
服务器响应 (Server Hello & Certificate)
- 服务器从客户端的密码套件列表中选择一个双方都支持的套件。
- 服务器返回它的TLS版本、一个服务器生成的随机数(
server_random)。 - 关键一步:服务器将自己的数字证书发送给客户端。这个证书里包含了服务器的公钥、域名信息、颁发机构等。
-
客户端验证证书与生成密钥
- 客户端收到证书后,会进行严格的验证:
- 检查证书是否由浏览器信任的根CA签发(验证签名链)。
- 检查证书是否过期。
- 检查证书上的域名是否与当前访问的域名一致。
- 如果证书验证通过,客户端就确认了服务器的身份是可信的。
- 客户端再生成第三个随机数,称为“预主密钥”(
pre-master secret)。 - 客户端使用从服务器证书中获取的公钥,对这个“预主密钥”进行加密,然后发送给服务器。
- 客户端收到证书后,会进行严格的验证:
-
服务器解密与生成会话密钥
- 服务器收到被加密的“预主密钥”后,使用自己的私钥进行解密,从而得到了原始的“预主密钥”。
- 现在,客户端和服务器双方都拥有了相同的三个信息:
client_random、server_random和pre-master secret。 - 双方使用之前约定好的密码套件中的算法,独立地、同步地将这三个随机数混合计算,生成一个最终的、独一无二的对称加密密钥,我们称之为“会话密钥”(Session Key)。
-
握手完成,开始加密通信
- 双方各自向对方发送一条“Finished”消息,这条消息是用刚刚生成的会话密钥加密的,用以验证握手过程是否成功。
- 如果验证通过,TLS握手就正式完成。
- 此后,客户端和服务器之间的所有HTTP通信,都使用这个会话密钥进行对称加密和解密,保证了通信的安全。