所谓的HTTPS单项认证和双向认证,其实是SSL/TLS的单项认证和双向认证。在8. PKI - SSL/TLS Handshake Protocol(TLS握手详解)已经对TLS协议有了一个比较详细的介绍。那单向认证和双向认证是怎么回事呢?
其实可以简单的理解为:
- 单项认证是客户端要对服务器进行认证;
- 双向认证是客户端要对服务器进行认证,同时服务器也要对客户端进行认证。
单项认证多用于B2C模式;双向认证多用于B2B模式。
下面从TLS报文角度对单项认证做一下分析:
1. 单项认证
如下图单项认证的报文中,虚线部分是省略掉的可选报文。其大致过程如下:
1)客户端发起ClientHello;
2)服务端回应SeverHello,该过程中服务器会将自己的证书发送给客户端;
3)客户端回应:客户端收到后,检查证书是否合法,主要检查下面4点:
- 检查证书是否过期
- 检查证书是否已经被吊销
- 证书是否可信
- 检查收到的证书中的域名与请求的域名是否一致
4)服务器的最后回应
2. 双向认证
在双向认证的报文中,多了一下三个报文:
- Client Certificate Request
- Client Certificate
- Certificate Verify
1)Client Certificate Request:服务器在SeverHello消息中,会要求客户端提供“客户端的证书”
2)Client Certificate:客户端发送证书给服务器
3)Certificate Verify:客户端将之前所有收到的和发送的消息组合起来,并用hash算法得到一个hash值,然后用客户端的私钥对这个hash进行签名,并发送给服务器
服务器收到客户端证书后:
a)验证客户端证书的合法性,如果验证不通过则会拒绝连接;
b)用客户端证书中的公钥去验证收到的Certificate Verify消息中的签名。这一步的作用是为了确认证书确实是客户端的。