【http】https协议
2023/01/09 18:08:58
http + 加密 + 认证 + 完整性保护 = https(http Secure )
http 协议中没有加密机制,但可以通 过和 SSL(Secure Socket Layer, 安全套接层 )或 TLS(Transport Layer Security, 安全层传输协议)的组合使用来加密 http 的通信内容。
为什么需要 https
http 存在以下缺陷:
- 通信使用明文(不加密),内容可能会被窃听。
- 不验证通信方的身份,因此有可能遭遇伪装。
- 无法证明报文的完整性,所以返回结果有可能遭篡改。
https 是为了弥补 http 的不足而设计的,期望达到以下效果:
- 所有信息加密通信,第三方无法窃听。
- 具有校验机制,一旦信息被篡改,双方会立刻发现。
- 身份认证,防止身份被冒充。
https 如何实现加密通信
本质上是通过非对称加密传递一个供对称加密使用的会话秘钥。
- 服务器有一个公钥和一个私钥,用于非对称加密。
- 客户端生成一个会话秘钥,用服务器的公钥加密后发送给服务器。
- 服务端收到加密后的会话秘钥后用自己的私钥解密出真实的会话秘钥。
- 双方都获得了会话秘钥,后续的通信用这个会话秘钥进行对称加密。
连接阶段是为了安全传递会话秘钥,采用非对称加密算法。
连接完成后就可以用会话秘钥,采用对称加密算法实现加密通信。
https 连接过程
- 客户端发送协商请求给服务端,包含自己支持的加密算法等信息。
- 服务器收到协商请求后,给客户端返回选定的加密算法、服务器证书(包含公钥)等信息。
- 客户端收到响应后生成随机字符串作为会话秘钥,通过协商好的非对称加密算法,用服务器公钥对该字符串加密并发送给服务端。
- 服务端用自己的私钥解密得到会话秘钥。
https 协议的不足
- 增加加解密过程、增加额外传输内容(证书),影响访问速度。
- 证书需要认向证机构付费获得。
- 整个页面的请求都要使用 https。
Q&A
如何保证服务器公钥不被篡改?
一个服务器对应一个证书,证书中包含公钥。
客户端检查服务端证书,公钥在证书中,只要证书是可信的,公钥就是可信的。
证书如何安全传输?假如证书在传递过程中被篡改?
服务器证书由有公信力的证书签发机构(CA)签发。
CA 根据网站提供的个人信息和公钥用 hash 算法生成消息摘要,它的私钥对消息摘要加密,形成证书签名保存在证书中。
客户端收到服务器证书后执行以下操作判断证书是否被篡改:
- 用同样的 hash 算法(证书中有)和证书内包含的个人信息和公钥再次生成消息摘要。
- 用 CA 的公钥(证书中有)对证书中的证书签名解密得到证书内的消息摘要。
将两次生成的消息摘要进行对比就能知道证书是否被篡改了。
客户端(浏览器)如何判断服务器证书是可信机构颁布的?
NSS 根证书库是一个开源的根证书库。
- 在 windows 平台中,微软有专门的根证书库。
- 在 Linux 平台中,软件和服务一般使用 NSS 根证书库。
- 在苹果平台中,也有专门的根证书库。
chrome 浏览器在 windows 系统中使用 windows 可信任根证书库,在 Unix 系统中使用 NSS 可信任根证书库。
详情参见:windows 中如何让 chrome 信任自签名证书?。