https是什么?
https即http+SSL,是基于http的一种加密传输方式,要了解https,首先就要了解SSL。
SSL
SSL是一种加密方式,主要分为三个部分:加密、数字签名、认证。
下面我们主要从这三个部分依次说起:
加密
SSL加密是把对称加密和非对称加密混合起来加密的。
加密和解密双方使用同一个密钥的方式叫做对称加密。这种方式最大问题是怎样将密钥传给对方,因此要保证密钥传输过程中的安全性,而普通的http请求并不具备安全性,故SSL不单独使用对称加密。
非对称加密解决了数据在网络上请求的安全问题,该方式里有两种密钥:公有密钥和私有密钥。
私有密钥用于解密,不能随意发布,公有密钥用于加密,可以随意发布,发送密文的一方使用公有密钥对数据进行加密,对方收到数据后用自己的私有密钥解密,私钥不能在网络上发送,因此不必担心安全性问题。
但以上方式也有局限性,比如在典型的http请求中,双方都要对数据进行加密,而私钥只在一方,另一方没有私钥不能对数据进行解密,而如果双方都使用非对称加密,则传输效率会很低。
那么如何才能使用在保证安全性和效率的情况下,客户端和服务端都能进行加密和解密呢?这正是SSL的加密原理,前面我已经说过SSL是通过非对称加密和对称加密实现的,你可以设想一下如何解决上述问题。
下面我们简单说说https中SSL的步骤,首先我们定义对称加密的密钥为对称密钥,非对称加密的密钥为公有密钥和私有密钥:
-
客户端向服务器发起SSL握手,此时客户端向服务器发送的报文信息为:
- 客户端支持的SSL版本
- 客户端支持的加密算法(包括Hash算法)
- 客户端支持的密钥长度
-
服务端收到客户端的报文后,再向客户端发送报文信息,此时报文信息为:
- 决定使用的SSL版本
- 决定使用的加密算法(包括Hash算法)
- 数字证书(包含公有密钥)
- 客户端通过验证数字签名取出数字证书内的公钥,并生成一个随机密码串,该随机密码串即为“对称密钥”,以后客户端和服务器都使用该随机密码串和约定的加密算法进行加密和解密。
- 客户端通过公有密钥对“对称密钥”进行加密传输给服务器
- 服务器通过私有密钥对报文进行解密得到“对称密钥”
- 至此双方都拥有了“对称密钥”,以后http通信都使用对称加密的方式进行消息传输,这样既保证了安全性,又不会降低性能。
SSL使用以上几步就解决了http请求的安全问题,看起来很简单,但是实际的SSL仍有许多步骤来完善上面几步。
数字签名
以上加密步骤的4、5步,SSL用了数字签名机制保证传输“对称密钥”的一致性,详细为:
- 客户端首先将“对称密钥”用约定好的Hash算法加密生成一个Digest,将Digest通过公有密钥加密生成一个Signature。
- 客户端同时发送“对称密钥”、Signature到服务端
- 服务端收到信息后,用私有密钥解密Signature得出Digest-1,再将“对称密钥”用Hash算法加密生成Digest,比较Digest-1与Digest是否一致,若一致则信息没有被篡改
从上面步骤可以看出数字签名是建立在非对称加密基础上的,实际上在SSL的许多过程中,数字签名也可以建立在对称加密的基础上。
认证
在以上SSL加密过程中的第2步,我们可以看到服务端向客户端传的是数字证书而不是公有密钥,实际上如果单独传输公有密钥,客户端不能确定该公有密钥就是服务器传来的公钥,因此数字证书机制就是来单独解决这个问题的。
数字证书,有点像生活中的身份证、护照等,是由一个官方的证书颁发机构(又名CA)签发的一组数据。这种证书很难伪造,用于使用者的身份证明。
客户端会对数字证书进行一段认证流程来取出数字证书里的公有密钥:
- 客户端通过证书中“证书颁发机构的数字签名”来验证证书的来源和完整性。一般客户端(如浏览器)会内置一个受信任的证书颁发机构列表。
- 一但认证通过,则取出证书内的公有密钥用于客户端与服务器的通信。
总结
我们可以用一张图来展示整个SSL加密的过程:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。