Https之(三)TLS双向认证
文章目录
- 双向认证操作
- 步骤原理
- Certificate Request
- Certificate
- Certificate Verify
上一篇 Https之(二)TLS的DH密钥协商算法
双向认证操作
我们先来实践一下双向认证的操作,我们使用一个免费的TLS测试网站https://badssl.com/,
1.首先打开https://badssl.com/download/下载客户端的证书,注意这个证书是p12证书,p12证书是包含私钥的,其结构如下:
-
私钥包(Key Bag)
存储加密的私钥,通常使用对称算法(如AES-256)保护,解密需依赖文件密码
-
证书包(Cert Bag)
包含X.509格式的公钥证书,可能涵盖:
- 用户证书:开发者或实体的身份凭证。
- 中间CA证书:链接至根证书的中间层。
- 根证书:信任链的顶级证书(可选)。
-
证书吊销列表包(CRL Bag)
存储证书吊销状态信息(CRL),用于验证证书有效性。
-
秘密数据包(Secret Bag)
存储应用自定义的敏感数据(如配置令牌或访问密钥)。
2.导入证书到浏览器,这里以火狐浏览器为例,打开设置->隐私与安全->证书管理->导入证书,将下载的证书导入,注意导入的时候需要输入密码,密码就是badssl.com。
3.访问https://client.badssl.com/,这时就会弹出发送证书确认框,点击确定就会把证书发送给服务端,服务端验证正确后就可以正常通讯。
步骤原理
我们直接通过TLS握手的抓包来分析双向认证的过程,下面是双向认证完整的握手图:
图中有多次握手过程,蓝色标记的是一次完整的过程,可以看到之前说的单向认证相比多了服务端发给客户端的Certificate Request、客户端发给服务端的Certificate和Certificate Verify,这次我们就不一步一步说明了,想看单向认证可以看之前的文章,这里我们就看这三步做了什么。
Certificate Request
这一步是服务端向客户端请求证书,其中包含了对证书的要求,
1.Certificate types:服务器可接受的客户端证书格式。
- RSA Sign (1):证书使用 RSA 签名公钥(传统算法)。
- DSS Sign (2):证书使用 DSA 签名公钥(已逐渐淘汰)。
- ECDSA Sign (64):证书使用 ECDSA 椭圆曲线签名公钥(现代推荐)。
2.Signature Hash Algorithms:服务器支持客户端在Certificate_Verify
消息中使用的签名算法的组合,这个后面讲Certificate_Verify
的时候介绍。
3.Distinguished Names:只接受由指定DN对应的CA签发的客户端证书。
Certificate
这个是客户端收到Certificate Request请求后向服务端发送证书,可以看到发送的证书是符合Certificate Request中对证书的要求的。需要注意这里的证书并不是我们前面下载的那个p12证书,而是p12证书中的证书包,因为p12中包含私钥包,虽然私钥需要密码解密,但是暴露出去也不安全。
Certificate Verify
这一步会对之前握手的消息进行Hash,然后使用客户端证书的私钥进行加密。
Signature Algorithm: rsa_pkcs1_sha256是摘要和加密的算法,分别是加密rsa和摘要sha256,这个就是之前Certificate Request中的Signature Hash Algorithms要求的算法。
Signature:是加密后的内容。
简单来说,这一步的作用是:“看,我确实能使用这个证书对应的私钥,这张证书真的是我的!”因为仅发送证书是不够的。任何中间人攻击者都可以窃听并转发这个证书,但它并不能证明客户端就是该证书的合法拥有者(私钥持有人)。Certificate_Verify
消息通过让客户端使用其私钥对握手过程中产生的一些关键数据进行数字签名来解决这个问题。只有拥有正确私钥的客户端才能生成服务器能用对应公钥验证通过的签名。