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.com
   i: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 2018
   i:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
-----BEGIN CERTIFICATE-----
MIIETjCCAzagAwIBAgINAe5fIh38YjvUMzqFVzANBgkqhkiG9w0BAQsFADBMMSAw
..............
-----END CERTIFICATE-----
 2 s:OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
   i: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: sha256WithRSAEncryption
         19: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.bin
    0:d=0  hl=2 l=  49 cons: SEQUENCE
    2:d=1  hl=2 l=  13 cons: SEQUENCE
    4:d=2  hl=2 l=   9 prim: OBJECT            :sha256
   15:d=2  hl=2 l=   0 prim: NULL
   17: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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

猫毛过敏却想养猫时?如何缓解猫毛过敏?宠物空气净化器推荐

作为一个新养猫的主人&#xff0c;一开始并没有发现对猫咪过敏。直到养了半年才意识到这个问题&#xff0c;而此时我已经和猫咪有了深厚的感情。我不想放弃我的猫咪&#xff0c;但是留着它的话&#xff0c;我经常会因为流眼泪、打喷嚏、眼睛发红等过敏症状而影响日常生活&#…

位运算03 不用加号的加法[C++]

图源&#xff1a;文心一言 上机题目练习整理&#xff0c;位运算&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 网页版目录在页面的右上角↗~&#x1f95d;&#x1f95d; 第1版&#xff1a;在力扣新手村刷题的记录~&#x1f9e9;&#x1f9e9; 编辑&#xff1a;梅…

go 1.18 不同目录package引用问题

go 1.18开始使用module了 不同的package在vs code中引用的话 需要先开启 是Go1.11版本之后 推出的版本管理工具 有点类似java的 maven工具 可以引入依赖使用 go env -w GO111MODULEon 先把这个打开 然后在创建的vs code工作目录下 执行 module gomdoule module 模块名 会生…

(六)激光线扫描-三维重建

本篇文章是《激光线扫描-三维重建》系列的最后一篇。 1. 基础理论 1.1 光平面 在之前光平面标定的文章中,已经提到过了,是指 激光发射器投射出一条线,形成的一个扇形区域平面就是光平面。 三维空间中平面的公式是: A X + B Y + C Z + D = 0 A X+B Y+C Z+D=0

解决RabbitMQ管理页面异常/不正确的问题

正确的页面&#xff1a;有Channels、Exchanges等 异常/不正确的页面&#xff1a; 问题原因 我的RabbitMQ是用docker安装的&#xff0c;应该不会是安装的环境有问题。 而且MQ的服务确实是启动了&#xff0c;后端能正常使用&#xff0c;并且管理界面的登录页面也是能正常登录的&…

流程图:理解、创建与优化的视觉工具

流程图&#xff1a;理解、创建与优化的视觉工具 引言 在日常生活和工作中&#xff0c;我们经常遇到需要描述一系列步骤或过程的情况。这些步骤可能是制作一杯咖啡、完成一个项目&#xff0c;或者是解决一个复杂的数学问题。流程图&#xff0c;作为一种强大的视觉工具&#xf…

数据同步MySQL -> Elasticsearch

大家好我是苏麟,今天聊聊数据同步 . 数据同步 一般情况下&#xff0c;如果做查询搜索功能&#xff0c;使用 ES 来模糊搜索&#xff0c;但是数据是存放在数据库 MySQL 里的&#xff0c;所以说我们需要把 MySQL 中的数据和 ES 进行同步&#xff0c;保证数据一致(以 MySQL 为主)…

在 Jupyter Notebook 中查看所使用的 Python 版本和 Python 解释器路径

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 我们在做 Python 开发时&#xff0c;有时在我们的服务器上可能安装了多个 Python 版本。 使用 conda info --envs 可以列出所有的 conda 环境。当在 Linux 服务器上使用 which python 命令时&#xff0…

ES通用查询页面使用说明

前言:ES语法比较复杂,需要专门的学习,而且查询工具不太友好, 对公司运维人员使用有点困难,所以花了个时间做了一个页面,方便运维人员使用,如下。 也不难,有兴趣的朋友可以私聊发源码。 开发帮助-ES数据查询 搜索 输入要查看的文档索引,文档类型后点【查询】即可 搜…

Python之Matplotlib

Matplotlib 是一个综合库&#xff0c;用于创建静态、动画、 和交互式可视化 安装 pip install matplotlib 功能 示例 import matplotlib.pyplot as plt plt.figure() plt.plot([1,2,3],[10,20,30]) plt.show() 官方文档&#xff1a; Matplotlib — Visualization with Pyt…

Covalent Network(CQT)发展新里程碑:SOC 2 数据安全认证通过,进一步加强了其人工智能支持

Covalent Network&#xff08;CQT&#xff09;现已完成并通过了严格的 Service Organization Control&#xff08;SOC) 2 Type II 的合规性审计&#xff0c;通过由备受行业认可的机构执行&#xff0c;进一步证明了 Covalent Network&#xff08;CQT&#xff09;团队坚定不移地致…

【区块链】智能交易模式下的数据安全流通模型

【区块链】智能交易模式下的数据安全流通模型 写在最前面**区块链智能交易模式概述****数据安全流通的挑战****数据安全流通模型的核心要素****实现数据安全流通的区块链技术****区块链智能交易模式下数据安全流通模型的设计原则****数据安全流通模型的应用案例分析****面临的挑…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(五)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

全面解析企业财务报表系列之四:财务报表的真实性和可靠性

全面解析企业财务报表系列之四&#xff1a;财务报表的真实性和可靠性 一、什么是会计方法二、选择会计方法三、会计方法的重要性四、会计报表常用的造假手段五、财务报表经常被遗漏的重要事件六、财务报告造假的资信敏感性七、财务报告审计的重要性八、审计报告 一、什么是会计…

HL祭记汇

一.写在前面 如果说廿四10天集训&#xff0c;对于我&#xff0c;是完成了从入门&#xff08;虽然可能我比别人入门更早&#xff1f;&#xff09;到准OIer的蜕变&#xff0c;那么&#xff0c;HL7天&#xff0c;可以说是真正成为了OIer&#xff0c;虽然是被小学生、初中生&#…

【时事篇-05-04】20240224 27笔货币基金中有3笔250元的具体数目测算( itertools)

结果展示 背景需求&#xff1a; 前文测算了27只货币基金&#xff0c;如果存145、146、147、148、149、150元分别需要存几笔。结果是4、4、4、5、5、5 【时事篇-05-03】20240222 金额145-150元填充27笔货币基金的具体数目测算&#xff08; itertools&#xff09;-CSDN博客文章…

1.30主成分分析,因子分析

主成分分析 主成分分析&#xff08;Principal Component Analysis&#xff0c;简称PCA&#xff09;是一种常用的多变量数据分析方法。它用于降低数据维度&#xff0c;以便更好地理解和解释数据集中的变化。PCA通过将原始数据投影到新的坐标轴上&#xff0c;使得新的坐标轴上的…

Raspbian命令行RTSP/RTP服务

Raspbian命令行RTSP/RTP服务 1. 源由2. Raspbian摄像头2.1 命令行启动RTP摄像头2.2 命令行启动RTSP摄像头 3. 示例3.1 测试RTP摄像头3.2 测试RTSP摄像头3.3 QGroundControl测试3.3.1 RTSP配置3.3.2 RTP配置 4. 总结5. 参考资料 1. 源由 鉴于实际测试发现RTP协议下&#xff0c;…

【MATLAB】CEEMD_ MFE_SVM_LSTM 神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 CEEMD_MFE_SVM_LSTM神经网络时序预测算法是一种结合了多种先进技术的复杂预测方法&#xff0c;旨在提高时序预测的准确性和稳定性。下面是对该算法的详细介绍&#xff1a; CEEMD&#xff…

常用的函数式接口(Supplier、Consumer、Predicate、Function)

目录 一.函数式接口作为方法的参数 二.函数式接口作为方法的返回值 三.常用的函数式接口 3.1生产型Supplier接口 3.2消费型Consumer接口 抽象方法&#xff1a;accept 默认方法&#xff1a;andThen 3.3判断型Predicate接口 抽象方法&#xff1a;test 默认方法&#xf…