为什么要使用 https?
因为 http 协议下, 数据都是明文传输的, 容易被截获, 修改转发.
https 实现原理:
概要: 通过非对称加密进行交互协商获得对称加密算法与密钥, 使用协商获得的加密算法与秘钥对交互数据加密
1) 浏览器将自己支持的一套加密规则请求服务器.
2) 服务器从中选出一组加密算法与 HASH 算法, 并将自己的身份信息以证书的形式发回给浏览器. 证书里面包含了网站地址, 加密公钥, 以及证书的颁发机构等信息.
3) 浏览器获得网站证书之后浏览器要做以下工作:
验证证书的合法性 (颁发证书的机构是否合法, 证书中包含的网站地址是否与正在访问的地址一致等), 如果证书受信任, 则浏览器栏里面会显示一个小锁头, 否则会给出证书不受信的提示. ?
如果证书受信任, 或者是用户接受了不受信的证书, 浏览器会生成一串随机数的密码, 并用证书中提供的公钥加密.
? 使用约定好的 HASH 算法计算握手消息, 并使用生成的随机数对消息进行加密, 最后将之前生成的所有信息请求给服务器.
?4) 服务器接收浏览器发来的数据之后要做以下的操作:
使用自己的私钥将信息解密取出密码, 使用密码解密浏览器发来的握手消息, 并验证 HASH 是否与浏览器发来的一致. ?
使用密码加密一段握手消息, 发送给浏览器.
?5) 浏览器解密并计算握手消息的 HASH, 如果与服务端发来的 HASH 一致, 此时握手过程结束, 之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密.
疑问:
为什么最终使用对称加密算法加密数据?
因为非对称加密算法加密数据的消耗远远大于对称加密算法
为什么需要 ca 证书与数字签名?
因为对数据进行加密, 客户端与服务器之间必须要一个协商过程:
使用对称加密则要协商加密算法与密钥, 无法保证协商的过程的数据安全
使用非对称加密无法保证公钥传递安全
使用第三方证书为什么可以避免这个问题?
因为使用第三方证书后, 避免了公钥的传递这个问题. 公钥内置在浏览器的 ca 证书列表里.(浏览求通过服务器发送过来 ca 证书去匹配浏览器内置的 ca 上级证书获得公钥验证签名)
浏览器是如何验证 ca 证书与数字签名?
浏览器收到服务器发送的证书后, 需要验证其真实性. 而证书的签名是通过签名算法 http://lib.csdn.net/base/datastructure 和上级 CA 的私钥生成的, 并非很多文章里简单说的靠 CA 私钥生成. 浏览器需要用上级 CA 的公钥才能解密签名, 并与生成的指纹对比.(上级 CA 即颁发证书的第三方机构, 上级 CA 证书是内置于浏览器或系统)
来源: http://www.bubuko.com/infodetail-2865361.html