SSL(Secury Sockets Layer)中文名是安全套接层协议,利用数据加密技术保障网络上的数据传输安全。我们都知道HTTP协议,是现在应用最广泛的网络协议,可它是不安全的。还好有HTTPS协议,即安全版的超文本传输协议。其实HTTPS的实现主要依赖于SSL,即在HTTP中加入了SSL层。
关于SSL的工作原理,前文提到SSL是利用了数据加密技术来保障网络数据传输安全的。数据加密技术分为对称加密和非对称加密,常用的用户名/密码加密就是对称加密,SSL则是采用了非对称加密。非对称加密技术是利用一对公钥和私钥来实现的,公钥可以公开但是私钥要保护起来。利用公钥加密的数据只能利用对应的私钥来解密,同样,利用私钥加密的数据只能利用公钥来解密。非对称加密解密过程大致是这样的:假设A与B要传输数据,首先他们都要获得对方的公钥,A先用B的公钥加密数据再用自己私钥加密数据,加密后将数据传输给B,由于只有用B的私钥和A的公钥才能解密即保证了数据传输的安全性又能确定这份数据是A发过来的相当于有A的签章。B拿到加密后的数据先用A的公钥解密再用自己的私钥解密,从而得到明文数据。类似于数字证书的签章与验章。
SSL的握手过程可以理解为一个客户端和服务器获得各自公钥的过程。SSL的握手都是由客户端发起的,过程大致如下:
1.客户端发送消息到服务端,里面携带了客户端的SSL版本、支持的密码对以及支持的数据压缩方法等信息。服务器收到消息也后返回一个消息,携带了选择的密码对和数据方法和一个X.509 V3的SSL数字证书,里面有服务器的公钥。V3版本是需要客户端也验证这个数字证书的。
2.客户端收到消息后,会立即发送一个“数字证书请求”消息给服务端。服务端收到消息后会立即回复一个消息,里面有客户端支持的数字证书类型和可以接受的CA(签章机构)名称。这其实是一个数字证书验证的过程。
3.客户端收到消息后,如果验证不通过,发送一个“没有数字证书”消息,这仅仅是一个警告消息,客户端会让用户自担风险。客户端仍然会用服务器的公钥加密自己的公钥发送给服务器,如果数字证书验证通过,这其中也加密了客户端数字证书。
这样客户端和服务器都知道了对方的公钥,就可以进行数据传输了。
SSL认证有单向和双向两种。
单向认证过程大致如下:
1.客户端发送消息给服务器,服务器收到消息后用自己的私钥加密消息,带上自己公钥一起回复给客户端。
2.客户端收到加密后的消息和服务器的公钥后,即用该公钥解密消息,再用服务器的公钥加密数据发送给服务器,服务器收到消息后用自己的私钥解密数据。
单向认证是不需要客户端的公钥私钥的,即不需要客户端认证。
双向认证过程大致如下:
1.客户端用自己的私钥加密消息并和自己公钥一起发给服务器,服务器收到消息后,先用客户端公钥解密数据,回复消息时候用自己的私钥加密消息并和自己的公钥一起回复。
2.客户端收到加密消息后,可以用服务器的公钥解密,然后发送消息给服务器,先用服务器的公钥加密,再用自己的私钥加密。服务器收到消息后可以用客户端的公钥和自己的私钥解密。
我的理解是双向认证是第一次交互单层加密,第二次交互双层加密。