假设互联网上的A和B要进行安全的通信,为了防止消息被别人截获以及篡改,它们会使用一个共同的暗号来对要发送的消息及接受的消息进行加密解密,这也就是大家经常提到的对称加密机制,其中暗号与谍战中的密码本大同小异。
对称加密似乎完美的解决了安全通信的问题,前提是通信的暗号或密码不被别人知道。
但该方法存在一个致命的问题:如何确定一个双方都同意的暗号?我们无法在一个不安全的信道传送一个私密的数据。
为此,有人提出了非对称加密方法(如RSA加密算法)。非对称机制下,每个用户包含两个key:public key和private key。公钥是给大家用的,可以通过网站、email供别人使用的;私钥就是自己的,必须小心保存。用公钥加密的内容只能用对应的私钥进行解密,反之亦然。
基于非对称加密我们可以实现数字签名,例如消息的发送者用他自己的私钥进行消息的加密,接受者用发送者的公钥对接收到的消息进行解密,从而实现不可否认性。
由于非对称加密方法一般都比较慢,性能较差,实际使用中也仅仅是用它确定一个双方要使用的暗号(也就是对称加密密码),此后的通信都还是基于对称加密机制。
同样的,非对称加密也涉及一个问题:公钥的发布和交换问题。如何去确定及验证一个信息发布者公钥的合法性。
为此,人们提出了CA(授权中心)的概念,授权中心会发行一个个的证书,每个证书本质上包含:实体或个人的名字以及对应的公钥。为了保证证书的安全性,授权中心用自己的私钥对证书进行加密,证书接受者用授权中心的公钥对该证书进行解密,从而实现证书的数字签名。
证书解密后,就可以拿到实体或个人的公钥了。
仔细考虑,这里还是有问题,如何去确定授权中心的公钥????
实际中,浏览器或操作系统会预先包含一些授权中心的公钥,从而解决该问题。
接下来,看看ssl工作的具体流程:
(1)访问一个https开头的网站时,浏览器和服务器首先会采用ssl建立一个安全信道。
(2)浏览器发送ssl的版本以及它可支持的对称加密算法,服务器基于这些信息会返回一个此次通信要使用的ssl版本、具体的加密算法以及该服务器的证书(包含了服务器的域名和公钥)
(3)浏览器采用对应授权中心的公钥检查该证书是否有效、有没有过期等。
(4)如果证书有效,浏览器生成一个本次会话要使用的对称加密密码,采用服务器的公钥加密,然后发送。
(5)此后,基于该生成的密码,浏览器和服务器就可以进行安全的通信了。