当前位置: 首页 > news >正文

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消息通过让客户端使用其私钥对握手过程中产生的一些关键数据进行数字签名来解决这个问题。只有拥有正确私钥的客户端才能生成服务器能用对应公钥验证通过的签名。

http://www.dtcms.com/a/348537.html

相关文章:

  • Linux->多线程2
  • openGauss之 无用join消除
  • 如何在 IDEA 中在启动 Spring Boot 项目时加参数
  • Ubuntu 服务器无法 ping 通网站域名的问题解决备忘 ——通常与网络配置有关(DNS解析)
  • 国内使用SSH稳定使用github
  • ROS 与 Ubuntu 版本对应关系
  • 基于Transformer的知识图谱推理模型(KnowFormer)
  • 使用python进行接口测试
  • .net9 解析 jwt 详解
  • Indy HTTP Server 使用 OpenSSL 3.0
  • 采摘机器人设计cad+三维图+设计说明书
  • 学习记录(二十一)-Overleaf中图片文字间隔太大怎么办
  • 【QT入门到晋级】进程间通信(IPC)-共享内存
  • Java数据结构——7.二叉树(总览)
  • 机器学习周报十
  • 从文本树到结构化路径:解析有限元项目架构的自动化之道
  • Rust Web开发指南 第二章(Axum 路由与参数处理)
  • gcc报错解决办法
  • Maxwell学习笔记
  • 如何让FastAPI在百万级任务处理中依然游刃有余?
  • Node【文件+模块化+对象】详讲:
  • OSG库子动态库和插件等文件介绍
  • k8s原理及操作
  • LLM 中评价指标与训练概要介绍
  • AI Prompt 的原理与实战
  • 【LeetCode】分享|如何科学的刷题?
  • 【深度学习】骨干网络(Backbone)
  • 毛选一卷解析
  • VAREdit:深度解读
  • k8s部署,pod管理,控制器,微服务,集群储存,集群网络及调度,集群认证