TLS握手证书链的校验

看一遍忘一遍,还是自己写一遍,看看这次能记多久。

在TLS握手过程中,通过证书校验认证服务端的身份和交换加密秘钥,握手完成之后后续就可以进行加密数据传输。

在浏览器地址栏上点击锁的图标,能打开查看证书的详细信息。
在这里插入图片描述
首先可以看到证书包含了多个层级,最下层的是我们直接访问的网站的服务证书,最上层是根证书。每个证书都属于一个机构组织。除了根证书是由根CA自己签发给自己的,其他证书都是由上一级组织用上一级的证书签发出来的,所以形成了层级结构。

点开细节可以看到证书的更多信息,主要看证书包含什么信息?

  • 签发机构,证书是哪个机构签发的
  • 持有机构,使用证书的机构
  • 证书有效期
  • 证书持有者公钥,用于解密下一级证书或者用于传输加密
  • 指纹哈希算法,对证书内容计算哈希,生成指纹
  • 证书指纹,对证书内容做哈希,用于验证证书没被修改过
  • 证书签名,使用签发机构的私钥对指纹加密生成签名,非对称加密用于安全认证
  • 证书签名算法

假设证书链是根CA颁发证书给中间CA,中间CA给网站颁发服务证书,验证过程是怎么样的?

  • 客户端访问网站,收到服务证书
  • 服务证书的颁发机构是中间CA,在验证服务证书前要验证中间CA,于是先验证中间CA的证书
  • 中间CA的证书由根CA颁发,根CA的根证书内置在浏览器或操作系统中,所以根证书不用验证,可以直接信任
  • 用根证书中的公钥解密中间CA证书的签名,拿到中间CA证书里的指纹,和计算出的指纹对比,一致则说明中间CA证书可信
  • 用中间CA证书中的公钥解密服务证书的签名拿到指纹,和直接计算的指纹对比,一致则服务证书可信
  • 服务证书可信,则证书上的信息是对的,接着检查持有机构是不是要访问的站点,证书有没有过期等
  • 至此,验证了访问的站点服务是可信的,继续后续TLS握手过程

说起来是不是很抽象,使用baidu证书走一遍验证的流程。这里我执行命令的系统是Ubuntu。

1. 获取证书文件

可以看到返回了三级证书,分别对应depth从0到2

openssl s_client -showcerts -connect www.baidu.com:443 </dev/null > baidu.pem
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign RSA OV SSL CA 2018
verify return:1
depth=0 C = CN, ST = beijing, L = beijing, O = "Beijing Baidu Netcom Science Technology Co., Ltd", CN = baidu.com
verify return:1
DONE

打开baidu.pem看看,里面清楚地描述了证书链。注意看CN的字段。
0 是baidu.com的证书,由GlobalSign RSA OV SSL CA 2018颁发;
1 是GlobalSign RSA OV SSL CA 2018的证书,由GlobalSign颁发;
2 是GlobalSign的证书,由GlobalSign Root CA颁发;

Certificate chain
# s表示证书持有人,i表示证书颁发机构0 s:C = CN, ST = beijing, L = beijing, O = "Beijing Baidu Netcom Science Technology Co., Ltd", CN = baidu.comi:C = BE, O = GlobalSign nv-sa, CN = GlobalSign RSA OV SSL CA 2018
-----BEGIN CERTIFICATE-----
MIIJ6DCCCNCgAwIBAgIMVeasrtH4pDD5qTjFMA0GCSqGSIb3DQEBCwUAMFAxCzAJ
.........
-----END CERTIFICATE-----1 s:C = BE, O = GlobalSign nv-sa, CN = GlobalSign RSA OV SSL CA 2018i:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
-----BEGIN CERTIFICATE-----
MIIETjCCAzagAwIBAgINAe5fIh38YjvUMzqFVzANBgkqhkiG9w0BAQsFADBMMSAw
..............
-----END CERTIFICATE-----2 s:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSigni:C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
-----BEGIN CERTIFICATE-----
MIIETjCCAzagAwIBAgINAe5fFp3/lzUrZGXWajANBgkqhkiG9w0BAQsFADBXMQsw
....................
-----END CERTIFICATE-----
Server certificate
subject=C = CN, ST = beijing, L = beijing, O = "Beijing Baidu Netcom Science Technology Co., Ltd", CN = baidu.com
issuer=C = BE, O = GlobalSign nv-sa, CN = GlobalSign RSA OV SSL CA 2018
---

注意到,浏览器上的根证书只到GlobalSign,也就是GlobalSign自己给自己颁发的。但是上面返回的内容并没有一个自己给自己颁发的根证书,和在浏览器上看到的不太一样。命令程序直接访问的证书验证是由操作系统完成的,而浏览器可能使用自己内置的根证书,两者返回的证书链可能不完全一致。
在这里插入图片描述

2. 提取三个证书

分别提取三个证书,保存为三个文件,为方便区别重名下。

cat baidu.pem | awk '/BEGIN/,/END/{if(/BEGIN/){++i}; out="cert"i".crt"; print >out}'
mv cert1.crt baidu.crt
mv cert2.crt inter-nv.crt
mv cert3.crt inter-r3.crt

3. 校验证书

inter-r3.crt 由GlobalSign_Root_CA签发的,使用系统内置的根证书校验
inter-nv.crt 由GlobalSign Root CA - R3签发,使用inter-r3.crt校验
baidu.crt 由GlobalSign nv-sa签发,使用inter-nv.crt校验

openssl verify -CAfile /etc/ssl/certs/GlobalSign_Root_CA.pem -no-CApath -untrusted inter-r3.crt -untrusted inter-nv.crt baidu.crt
baidu.crt: OK

我们可以手动执行下最后一步baidu.com证书验证的步骤。

4. 查看签名

openssl x509 -in baidu.crt -text -noout -certopt ca_default -certopt no_validity -certopt no_serial -certopt no_subject -certopt no_extensions -certopt no_signame
Signature Algorithm: sha256WithRSAEncryption19:5a:67:50:43:b1:ac:7a:93:a8:68:18:72:8b:40:7e:a6:75:de:ac:21:fc:c9:41:16:20:4b:f3:8c:0b:b9:47:45:ae:f8:5d:79:f6:43:35:26:01:98:f0:b9:86:3e:29:01:f1:df:b0:72:b5:ae:78:d2:df:61:b6:78:67:8a:c9:77:9a:de:e0:e4:41:2f:9c:1e:e5:3b:7c:97:3f:42:2f:ad:e3:49:7f:9d:2b:02:88:90:69:25:03:01:14:b9:b5:cb:0f:59:3d:2d:97:3d:02:d5:51:90:69:0c:81:10:22:da:c6:51:ef:48:0c:d2:4f:de:61:f2:6a:87:15:a5:6d:71:8e:37:02:a2:85:0f:1e:19:75:a3:80:2e:6a:1a:a2:02:8c:2f:ec:bd:3d:81:03:3f:8a:c0:a0:e6:b4:0e:08:57:cb:00:1c:8a:b7:1b:8f:38:71:9a:8d:c0:71:0c:3f:bc:d4:be:56:9d:f7:18:c1:aa:be:e4:df:1a:86:e2:62:6f:23:86:30:54:78:2d:47:1f:b4:ad:05:29:73:24:98:14:a0:19:c0:02:fd:90:90:4e:62:5c:e8:4d:31:89:c3:e8:8b:9e:73:59:3b:98:91:ca:47:a5:05:5b:c5:1e:8f:85:39:0e:ce:b5:26:0a:80:4e:9f:08:4a:11:49:13:63

5. 提取签名

openssl x509 -in baidu.crt -text -noout -certopt ca_default -certopt no_validity -certopt no_serial -certopt no_subject -certopt no_extensions -certopt no_signame | grep -v 'Signature Algorithm' | tr -d '[:space:]:' | xxd -r -p > baidu-signature.bin

6. 从中间证书提取公钥

openssl x509 -in inter-nv.crt -noout -pubkey > issuer-pub.pem

7. 使用公钥解密签名

openssl rsautl -verify -inkey issuer-pub.pem -in baidu-signature.bin -pubin > baidu-signature-decrypted.bin

8. 查看签名

将ASN.1数据解析并以易于阅读的格式显示出来

openssl asn1parse -inform DER -in baidu-signature-decrypted.bin0:d=0  hl=2 l=  49 cons: SEQUENCE2:d=1  hl=2 l=  13 cons: SEQUENCE4:d=2  hl=2 l=   9 prim: OBJECT            :sha25615:d=2  hl=2 l=   0 prim: NULL17:d=1  hl=2 l=  32 prim: OCTET STRING      [HEX DUMP]:C344DC4526E5D6C357B7FF936995F07F3BA852F9F0F3F23CAA7228BAE87D9D60

8. 提取证书body

openssl asn1parse -in baidu.crt -strparse 4 -out baidu-body.bin &> /dev/null

9. 计算证书签名

可以看到和证书解析后看到一致。

openssl dgst -sha256 baidu-body.bin
SHA256(baidu-body.bin)= c344dc4526e5d6c357b7ff936995f07f3ba852f9f0f3f23caa7228bae87d9d60

这样就验证了从GlobalSign nv-sa签发baidu证书是完整的。整个证书链的验证其实就是重复这个过程。

/etc/ssl/certs/GlobalSign_Root_CA.pem => inter-r3.crt => inter-nv.crt => baidu.crt

参考 https://juejin.cn/post/6844904143719497735

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2805950.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【大模型 数据增强】NeuScraper:神经网络抓取工具,超传统网页抓取工具20%

NeuScraper&#xff1a;神经网络抓取工具&#xff0c;从网页中提取主要内容 提出背景流程框架精细拆解 效果对比 提出背景 论文&#xff1a;https://arxiv.org/pdf/2402.14652.pdf 代码&#xff1a;https://github.com/OpenMatch/NeuScraper 假设我们需要从一个新闻网站上抓…

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理 各位大佬&#xff0c;这是我的自学笔记&#xff0c;如有错误请指正&#xff0c;也欢迎在评论区学习交流&#xff0c;谢谢&#xff01; CUDA编程模型 我们使用CUDA_C语言进行CUDA编程&am…

备战蓝桥杯---基础算法刷题2

题目有一点水&#xff0c;不过还是有几个好题的&#xff0c;我在这分享一下&#xff1a; 很容易想到先往最高处跳再往最低处跳&#xff0c;依次类推&#xff0c;那怎么保证其正确性呢&#xff1f; 证法1. 在此&#xff0c;我们从0开始&#xff0c;假设可以跳到a,b,c(a<b<…

js之事件代理/事件委托

事件代理也叫事件委托&#xff0c;原理&#xff1a;利用DOM元素的事件冒泡&#xff0c;指定一个事件的处理程序就可以管理某一类型的所有事件。 事件冒泡和事件捕获 如上图所示&#xff0c;事件传播分成三个阶段&#xff1a; 捕获阶段&#xff1a;从window对象传导到目标节点&…

即时设计和Axure对比,哪一个好用?

无论是国外页面设计工具&#xff0c;页面设计工具的发展从来没有停滞过&#xff0c; Axure&#xff0c;无论是国产设计工具即时设计&#xff0c;其功能都在不断更新迭代&#xff0c;为设计带来更高效的设计体验。今天对比两个设计工具&#xff0c;帮你找到最适合自己的&#xf…

C#与VisionPro联合开发——串口通信

串口通信 串口通信是一种常见的数据传输方式&#xff0c;通过串行接口&#xff08;串口&#xff09;将数据以串行比特流的形式进行传输。在计算机和外部设备之间&#xff0c;串口通信通常是通过串行通信标准&#xff08;如RS-232&#xff09;来实现的。串口通信可以用于连接各…

在Ubuntu中使用python

目录 一、利用vim使用python 1、下载vim 2、使用vim创建python文件 3、编辑完成后的vim操作 4、如何运行 5、vim常见操作 二、安装Jupyter 1、更新系统 2、安装pip 注&#xff1a;pip无法应用的原因及解决方案 3、安装Jupyter 4、打开Jupyter 三、安装其他Python模…

如何食用Kaggle的Course中的exercise?

前言 读完本文只需要几分钟&#xff0c;读完后你将知道&#xff1a; 如何连接kaggle的反馈系统如何检查代码正确性如何查看提示如何查看答案。 关于Setup 通常最上面的会有一块代码&#xff0c;它的功能是连接kaggle的反馈系统&#xff0c;这样才能执行能够提供反馈的代码。…

离散数学(一) 集合

属于关系 表示 枚举法&#xff1b; 叙述法&#xff1b; 文氏图法 基数 空集 全集 全集是相对唯一的 相等关系 有相同元素看作一个元素 包含关系 幂集 集合运算 并集 交集 补集 差集 对称差集 定理 可数集合与不可数集合 自然数集 等势 如果存在集合A到集合B的双射(又称一一…

kafka为什么性能这么高?

Kafka系统架构 Kafka是一个分布式流处理平台&#xff0c;具有高性能和可伸缩性的特点。它使用了一些关键的设计原则和技术&#xff0c;以实现其高性能。 上图是Kafka的架构图&#xff0c;Producer生产消息&#xff0c;以Partition的维度&#xff0c;按照一定的路由策略&#x…

JavaSE-05笔记【面向对象02】

文章目录 1. 类之间的关系2. is-a、is-like-a、has-a2.1 is-a2.2 is-like-a2.3 has-a 3. Object类3.1 toString()3.2 finalize()&#xff08;了解即可&#xff09;3.3 与 equals 方法 4. package 和 import4.1 package4.2 import4.3 JDK 常用开发包 5. 访问权限控制5.1 privat…

AutoHotKey 双击Ctrl 打开指定程序、网页

一、AutoHotKey 下载 CSDN 下载链接&#xff1a;AutoHotKey V2.0.11 二、编写脚本 新建一个txt文本, 如&#xff1a;myHotKey.txt; 支持中文名称、目录; 修改文件扩展名为 ".ahk"; 右击文件&#xff0c;开始编辑文件&#xff1a; 编写、复制以下代码&#xff0c…

C++标准库与Boost库:功能丰富的开发工具集

C标准库与Boost库&#xff1a;功能丰富的开发工具集 C是一种强大的编程语言&#xff0c;而C标准库和Boost库则为C开发者提供了广泛的工具和功能。本文将深入探讨C标准库和Boost库&#xff0c;介绍它们的特点、提供的功能以及如何在项目中使用它们来加速开发过程和提高代码质量。…

【C++】类与对象—— 初始化列表 、static 静态成员、

类与对象 1 再谈构造函数1.1 构造函数体赋值1.2 初始化列表语法&#xff1a;建议&#xff1a;初始化顺序&#xff1a;注意&#xff1a; 1.3 explicit关键字 2 static 静态成员2.1 概念2.2 声明成员变量2.3 使用类的静态成员2.4 定义静态成员总结 Thanks♪(&#xff65;ω&#…

防御保护——笔记(8-11)

内容安全 攻击可能只是一个点&#xff0c;防御需要全方面进行 IAE引擎 DFI和DPI技术--- 深度检测技术 DPI --- 深度包检测技术--- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对数据包的内容进行识别。&#xff08;应用层…

【Flink精讲】Flink组件通信

主要指三个进程中的通讯 CliFrontendYarnJobClusterEntrypointTaskExecutorRunner Flink内部节点之间的通讯使用Akka&#xff0c;比如JobManager和TaskManager之间。而operator之间的数据传输是利用Netty。 RPC是统称&#xff0c;Akka&#xff0c;Netty是实现 Akka与Ac…

STL用法

参考原文&#xff1a;C中STL用法超详细总结&#xff08;收藏级&#xff09; - 知乎 1 什么是STL&#xff1f; STL&#xff08;Standard Template Library&#xff09;&#xff0c;即标准模板库&#xff0c;是一个具有工业强度的&#xff0c;高效的C程序库。它被容纳于C标准程…

【紫光同创国产FPGA教程】——(盘古EU22K开发板/PGL22G第四章)数字时钟实验例程

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 适用于板卡型号&#xff1a; 紫光同创PGL22G开发平台&#xff08;盘古EU 22K&#xff09; 仅需一根TypcC线&#xff0…

【牛牛送书 | 第四期】《高效使用Redis:一书学透数据存储与高可用集群》带你快速学习使用Redis

前言&#xff1a; 当今互联网技术日新月异&#xff0c;随着数据量的爆炸式增长&#xff0c;如何高效地存储和管理数据成为了每个公司都必须面对的挑战。与此同时&#xff0c;用户对于应用程序的响应速度和稳定性要求也越来越高。在这个背景下&#xff0c;Redis 作为一个…

消息中间件篇之RabbitMQ-消息不丢失

一、生产者确认机制 RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后&#xff0c;会返回一个结果给发送者&#xff0c;表示消息是否处理成功。 当消息没有到交换机就失败了&#xff0c;就会返回publish-confirm。当消息没有到达MQ时&…