网络通讯中的加密方式和证书机制,如对称、非对称,HTTPS就一定安全吗?什么是中间人攻击?CA证书机制是什么?
HTTPS
HTTPS = HTTP + TLS/SSL
SSL:Secure Socket Layer,安全套接字层,SSL3.0后更名为TLS;- TLS:传输层安全协议,建立在传输层、应用层之间,为应用层提供数据封装、压缩、加解密等功能;
- TLS 1.1,1.2(废弃)
- TLS 1.2(主流)
- TLS 1.3(性能更好,更安全)
HTTPS握手过程
- 客户端发起HTTPS请求(443端口),告知服务端,自己支持的TLS版本、加密套件、和第1个随机数
- 服务端确认支持的TLS版本、选择的加密套件、并生成第2个随机数,返回给客户端
- 随后服务端发送CA证书(含有服务端公钥和CA签名)给客户端
- 服务端发送Server Hello结束报文
- 客户端使用CA公钥(内置于操作系统)验签服务端证书,并获取服务端公钥;
- 客户端生成第3个随机数,并使用公钥加密,发送给服务端,服务端私钥解密拿到预主密钥(第三个随机数)
只有客户端、服务端知道 预主密钥
双方通过3个随机数 计算出 会话密钥,第三个随机数不会被中间人替换;
- 服务端确认握手完成,后续数据通信,都使用随机数生成的会话密钥进行加密通信
非对称加密:用于交换信息、验证身份、保障获取对称密钥; 对称加密:效率高,用于最终业务数据通信
为什么需要3个随机数?
HTTPS握手过程是铭文传输的,使用多个随机数计算得到最终的通信密钥,更不容易破解;
HTTPS都加密了什么?
HTTPS对整个
Http header + Http body
进行加密;
GET https://cn.bing.com/fd/ls/lsp.aspx HTTP/1.1 HOST: https://cn.bing.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X) Keep-Alive: 300 Connection: keep-alive
数字签名
使用数字签名保证数据不被篡改;签名验签过程:
- 服务端将要传输的文件进行哈希运算 => 文件哈希值;
- 服务端使用私钥对哈希值进行签名运算 => 数字签名;
- 服务端发送文件、数字签名、公钥给客户端;
- 客户端拿到文件和服务端公钥,使用公钥进行验签,得到文件哈希值1;
- 客户端使用相同的哈希运算,得到文件哈希值2;
- 两个哈希值相同,则验签通过,数据未被篡改;否则验签失败;
中间人
中间人将数据截获,并使用中间人自己的公私钥进行签名,再使用中间人自己的公钥替换服务端的公钥,仍能保证数据在用户端验签的时候成立;
数字签名无法保证公钥不被伪造,中间人能够伪造公钥
因此仍需要一个机制能够验证用户拿到的公钥,就是所请求的服务方的,即数字证书机制
数字签名算法
- RSA
- DSA
- ECDSA
安全数字签名算法:RSA(≥3072 bits)/ECDSA(>=256 bits)
数字签名方式
1、自签名
- openssl
- 在线证书申请 2、CA认证
数字证书
数字证书由公认的、可信赖的证书颁发机构进行签名、颁发(CA机构)
1、服务端向CA机构提供身份信息 + 公钥,由CA机构的私钥进行签名颁发证书,证书内含有服务端的身份信息 + 公钥 + CA签名;
- 身份信息:公司、网站、域名等等信息;
- 公钥:服务器自己的公钥,CA机构会对其进行加密,放在证书中;
2、客户端在与服务端建立连接时,需要拿到服务端的证书,并使用提前预置在操作系统中的CA根证书对其进行验证,证明服务端的身份,保证证书不被伪造,即公钥不被替换;防止了中间人篡改;
- 重点:根证书预置在操作系统中,不需要网络就可以验证服务器证书;
- 根证书可以对服务器证书的公钥进行解密获取;安全的获取公钥;