在网络中,数据在服务器端和客户端之间传递,由于是明文传递的内容,一旦在网络被人监控,数据就可能一览无余地展现在中间的窃听者面前。
为此我们需要将数据加密后再进行网络传输,这样即使数据被截获和窃听,窃听者也无法知道数据的真实内容是什么。
但是对于我们的应用层协议而言,如HTTP、FTP等,我们仍然希望能够透明地处理数据,而无须操心网络传输过程中的安全问题。
在网景公司浏览器推出之初就提出了SSL(安全套接层)。SSL作为一种安全协议,它在传输层提供对网络连接加密的功能。对于应用层而言,它是透明的,数据在传递到应用层之前就已经完成了加密和解密的过程。随后IETF(工程任务组)将其标准化,称为TLS(安全传输层协议)。
TLS/SSL 是独立于 HTTP 的协议,所以不光是 HTTP协议,其他运行在应用层的 SMTP 和 Telnet 等协议均可配合 TLS/SSL 协议使用。可以说 TLS/SSL 是当今世界上应用最为广泛的网络安全技术。
TLS/SSL是一个公钥/私钥的结构,它是一个非对称的结构,每个服务器端和客户端都有自己的公私钥。公钥用来加密要传输的数据,私钥用来解密接收到的数据。公钥和私钥是配对的,通过公钥加密的数据,只有通过私钥才能解密,所以在建立安全传输之前,客户端和服务器端之间需要互换公钥。
客户端发送数据时要通过服务器端的公钥进行加密,服务器端发送数据时则需要客户端的公钥进行加密,如此才能完成加密解密的过程。
公私钥的非对称加密虽好,但是网络中依然可能存在窃听的情况,典型的例子是中间人攻击。客户端和服务器端在交换公钥的过程中,中间人对客户端扮演服务器端的角色,对服务器端扮演客户端的角色,因此客户端和服务器端几乎感受不到中间人的存在。
为了解决这种问题,数据传输过程中还需要对得到的公钥进行认证,以确认得到的公钥是出自目标服务器。如果不能保证这种认证,中间人可能会将伪造的站点响应给用户,从而造成经济损失。
为了解决这个问题,TLS/SSL引入了数字证书来进行认证。与直接用公钥不同,数字证书中包含了服务器的名称和主机名、服务器的公钥、签名颁发机构的名称、来自签名颁发机构的签名。在连接建立前,会通过证书中的签名确认收到的公钥是来自目标服务器的,从而产生信任关系。
客户端在发起安全连接前会去获取服务器端的证书,并通过CA的证书验证服务器端证书的真伪。除了验证真伪外,通常还含有对服务器名称、IP地址等进行验证的过程。