通信流程
1.客户端使用https的url访问web服务器,要求与web服务器建立ssl连接。
2.web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
3.客户端浏览器与web服务器协商ssl连接的安全等级,即信息加密的等级。
4.客户端浏览器根据安全等级,建立会话密钥(产生随机对称密钥),然后利用网站的公钥将会话密钥加密,并传送给网站。
5.web服务器利用自己的私钥解密出会话密钥。
6.web服务器与客户端浏览器利用会话密钥对称加密之间的通信。
HTTPS优点
1.比http安全,可防止中间人攻击,确保数据在传输过程中不被窃取、篡改。
缺点
1.握手协议比较耗时,会延长页面加载时间。
2.HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗。
3.证书需要付费。
证书预置和申请
1:客户端浏览器会预置根证书, 里面包含CA公钥
2:服务器去CA申请一个证书
3: CA用自己的签名去签一个证书,指纹信息保存在证书的数字摘要里面, 然后发送给服务器
一次访问流程(简化)
1: 客户端 sayHello
2: 服务器返回证书
3-1: 客户端验证证书内容有效性(过期时间, 域名是否相同等)
3-2: 验证证书的有效性 (是否被串改), 通过本地根证书的CA公钥解密数字摘要,看是否匹配。
3-3:如果数字签名验证通过, 就可以使用服务器证书里面提供的公钥进行下一步通信。
客户端如何验证证书的合法性
首先浏览器读取证书中的证书所有者、有效期等信息进行校验,校验证书的网站域名是否与证书颁发的域名一致,校验证书是否在有效期内
浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。
如果找到,那么浏览器就会从操作系统中取出颁发者CA 的公钥(多数浏览器开发商发布
版本时,会事先在内部植入常用认证机关的公开密钥),然后对服务器发来的证书里面的签名进行解密
浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比
对比结果一致,则证明服务器发来的证书合法,没有被冒充