SSL协议并不陌生,平常见到的以https开头的网站都是采用了SSL协议,虽然SSL协议加在HTTP上最为常见,但它的使用并不限于http,应该说http是在SSL协议层之上的协议,因为http协议属于应用层协议而SSL协议则属于网络层协议。
下面几篇文章对SSL协议做了详细说明:
https://en.wikipedia.org/wiki/Transport_Layer_Security
http://baike.baidu.com/view/14121.htm
我们以常见的https为例,它的工作原理就是在客户端和服务器间建立网络连接的时候,服务器会发送一个证书(certificate)给客户端表明自己的身份,通常该证书是由一个专业CA机构签发的(当然你也自己签发一个证书,但客户端一般不信任),客户端检查并接收了该证书后,双方就要协商和交换加密方法和密钥,等这些步骤完成了,一个基于SSL的网络连接也就建立了,这就是我们通常所说的握手。下面是对SSL握手过程的详细描述。
http://tse2.mm.bing.net/th?id=OIP.M4194b9e9f77470d1936cdafb0423ca16H0&pid=15.1
客户端怎么信任一个证书的签名方呢?
客户端一般维护自己的一个信任的签名方库(trust store),如果该证书的签名在自己的库里,那么就接受,否则就拒绝或警告,通常浏览器会采用警告的方式,如下面。Oracle Java也同样维护一个标准CA列表。
http://tse4.mm.bing.net/th?id=OIP.M39ac598f871f385775b5566ac205b886o0&pid=15.1
什么是双向验证?
普通的https协议一般是单向验证,用来让浏览器确保接收的网页内容是未经网络攻击者(如一些国内的电信服务商)窜改的,在这种情况下,网站提供方的shu求并不是确保客户端合规等,而是确保所有客户端接收到的内容是如实提供的内容。反过来双向检验是在单向检验(客户端检验服务器的证书)的基础上,服务器还要检验客户端是否是一个被授权的用户。如何检验?那就让客户端在建立连接时发一个表明自己身份的证书。由于每个客户端不太可能自己去CA机构上购买证书,所以一般采用的方法是服务器在前期授权用户时给用户提供一个证书,由于该证书是由服务器方提供的,所以可以为每个用户提供一个专用证书,用于在连接时识别每个客户。
由此可见,双向检验一般应用于非公共服务的情况,因为它限制客户;而单向检验往往用于公共服务,因为它不限制客户。