HTTPS :http over ssl 服务器和浏览器之间交互为了安全会使用密钥进行加密。 服务器不确定有多少客户端,不会为每个客户端准备一套密钥,所有的客户端都会用一套密钥,所有的客户端都可以向服务器申请密钥且得到的是一样的。 如果使用对称加密,黑客也可以从服务器获取key,这样双向通讯都没有秘密可言。 如果使用非对称加密,S->C通讯不安全,黑客也可以从服务器获取公钥,服务器给客户端的内容等于明文 。 使用对称加非对称的方式比较合适,但是缺陷是中间人攻击。
浏览器采用非对称+对称加密工作步骤: 1.客户端向浏览器请求非对称加密的公钥(私钥SK,公钥PK) 2.浏览器本地生成随机num,利用非对称密钥,公钥加密发送给服务器 3.服务器利用私钥解密得到num,从起num作为两方进行数据机密的对称密钥
这种方式的缺陷--中间人攻击:黑客在第一步就截取了客户端的通讯,黑客给客户端返回一个黑客的公钥,这样客户端就会和黑客建立一套密钥体系,然后黑客伪装客户端和服务端建立一套密钥体系,客户端和服务端彻底失联,黑客作为中间人转发消息, 黑客浏览器的信息解密后在使用服务器的密钥加密转发给服务器,服务器返回的信息,黑客加密后使用自己的密钥加密发送费浏览器。
解决办法,引入CA 服务器先向CA机构申请证书,当客户端第一步向浏览器请求公钥的时候,服务器不直接返回公钥,而是返回CA证书 CA为服务器生成证书的过程: CA机构有自己的一套非对称公钥私钥(私钥CSK,公钥CPK),服务器向CA申请证书,CA会将(PK和服务器的一些信息)使用CSK加密生成证书 操作系统中会写预装大量权威CA机构的公钥(其实是根证书),所以,浏览器不需要去CA申请CPK, 操作系统在进行第一步申请得到证书,使用本地浏览器的SPK解密就能服务器的PK(然后经过多次通信,客户端和服务端都会添加随机数,来生成最后通信用的 对称密钥)
根证书的作用: CA除了颁发给服务者证书外,自己也给自己颁发一套证书,称之为根证书,根证书也有自己的公钥私钥 根证书的公钥和加密算法公开,私钥CA自己严格保密 证书有一个叫指纹的字符串来代表唯一身份 数字证书在颁发的时候 CA机构将证书的指纹和指纹算法通过自己的私钥加密得到的就是证书的签名了 我们在验证证书的时候, 首先通过机构的根公钥去解密证书的签名, 解密成功的话会得到证书的指纹和指纹算法, 指纹是一个hash值,它代表着证书的原始内容, 此时再通过指纹算法计算证书内容得到另外一个hash值, 如果这两个hash值相同,则代表证书没有被篡改过,否则就是被篡改了 世界上权威CA机构的根证书都是预先嵌入到操作系统中的, 如果在操作系统中没有找到对应的根证书,就代表此机构不是受信任的, 那么就会警告无法确认证书的真假,比如以前打开12360网站就会提示,现在不会了
|