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

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.xdnf.cn/news/18615.html

相关文章:

  • 打响“A+H”双重上市突围战,云天励飞实力如何?
  • 云原生俱乐部-RH294知识点归纳(3)
  • [滑动窗口]1493. 删掉一个元素以后全为 1 的最长子数组
  • 今天学习计算机网格技术的TCP,UDP以及OSPF
  • 【AI智能体】Dify 搭建业务单据差异核对助手实战详解
  • 【Spring Cloud 微服务】3.智能路由器——深入理解与配置负载均衡
  • 【数据结构】从基础到实战:全面解析归并排序与计数排序
  • 在 Docker 容器中查看 Python 版本
  • SpringBoot的学生学习笔记共享系统设计与实现
  • SO_REUSEADDR
  • 计算机视觉与自然语言处理技术体系概述
  • Python内置函数全解析:30个核心函数语法、案例与最佳实践指南
  • Shell脚本-expect
  • Linux 软件编程(十)网络编程:网络协议,UDP 与 TCP 知识点
  • 计算机网络基础(三) --- TCP/IP网络结构(运输层)
  • golang3变量常量
  • Shell脚本-影响shell程序的内置命令
  • MATLAB 在工程仿真中的实践:以机械振动分析为例的完整流程
  • STM32 入门实录:macOS 下从 0 到点亮 LED
  • Java 编译器的世界:前端、JIT 与 AOT 的秘密:详解 Java 的编译过程与编译器生态
  • QT面试题总结(持续更新)
  • Excel 表格 - 合并单元格、清除单元格格式
  • kubernetes中的认证和授权
  • 小程序全局状态管理:使用MobX进行跨组件数据共享详解(九)
  • 国内使用SSH稳定使用github
  • 分布式账本:当不可篡改性遭遇法律拷问
  • ​Mac用户安装JDK 22完整流程(Intel版dmg文件安装指南附安装包下载)​
  • 【链表 - LeetCode】206. 反转链表【带ACM调试】
  • [身份验证脚手架] 前端认证与个人资料界面
  • 商密保护迷思:经营秘密到底需不需要鉴定?