先回答这些问题:
- 证书是什么?
- 证书解决能解决什么问题?
- 证书和CA机构的关系?
数字证书
数字证书的定义:
公开密钥认证(英语:Public key certificate),又称数字证书(digital certificate)或身份证书(identity certificate),就类似人的身份证。
它用于公开密钥基础建设的电子文件,用来证明公开密钥拥有者的身份。 此文件包含了公钥信息、拥有者身份信息(主体)、以及数字证书认证机构(发行者)对这份文件的数字签名,以保证这个文件的整体内容正确无误。
简而言之,认证机构用自己的私钥对需要认证的人(或组织机构)的公钥施加数字签名并生成证书,即证书的本质就是对公钥施加数字签名。
证书格式
证书有不同格式类似,不同格式记录的信息,记录的格式有所不一样,下面举例X.509格式:
X.509 标准规定了证书可以包含什么信息,并说明了记录信息的方法(数据格式)。除了签名外,所有 X.509 证书都包含以下数据:
证书具体的样子:
证书的工作流程
要了解证书的工作流程,需要先了解一下CA机构的作用,以及一些配套密码算法,HASH、非对称加密、数字签名,因为证书是CA机构生成的,只有CA机构生成的证书,才能验证身份。
PKI的引入
CA机构+证书+用户 这一套整管理流程和认证服务的结合,这就是PKI公钥基础设施(PKI —— Public Key Infrastructure)。
PKI 的核心功能是:解决了谁是谁的鉴权问题,它提供网络上的身份证发行与身份证验证服务。
他发的身份证就是数字证书,他提供的身份验证服务就是签名、验签机制。
PKI 的鉴权是通过建立了一个信任链,去解决在不安全的网络环境中如何确认和验证身份的问题,PKI也是现代网络安全的基础。
PKI是如何实现身份认证的?
- 怎么防止身份冒充:防止攻击者假冒合法实体?
- 怎么防止中间人攻击:确保通信双方直接相连,没有恶意中介?
- 怎么做到不可否认性:证明某个操作确实是由特定实体执行的?
为了解决这些问题,PKI都做了些什么?
需要了解一下构成PKI的一些要素:
- CA (Certificate Authority,证书授权机构,就类似公安部门,可以查询验证人的身份证)
- 申请人(被验证身份方)
- 用户 (对于用户来说,证书和CA都是透明无感的,因为系统自动帮忙用户去做校验了。)
PKI所涉及的技术:
- 非对称加密
- Hash
- 数字签名
CA提供的服务
-
CSR(Certificate Signing Request,证书签名请求)
是由申请人生成的包含其公钥和身份信息等内容的文件。它被发送给 CA,用于申请数字证书。CA 会根据 CSR 中的信息来创建数字证书,并使用自己的私钥对证书进行签名。 -
证书格式
PKI 中常用的证书格式有 X.509 等,这由 申请人(被验证身份方) 在申请的时候选择一个证书格式。X.509 证书包含了证书版本、序列号、签名算法标识、颁发者名称、有效期、主体名称、主体公钥信息等多个字段,以一种标准化的方式来存储和传输证书信息,确保不同的系统和应用能够正确地解析和验证证书。 -
预制证书
通常是指在某些特定场景下,提前生成并颁发好的数字证书。例如,一些设备制造商可能会在设备出厂前就为设备预装证书,以便设备在接入网络时能够快速进行身份认证和安全通信。这些预制证书一般是由设备制造商或相关的 CA 按照一定的规则和流程进行生成和颁发的。
预制证书就是帮CA做了一半工作的证书,只是还没有加签名而已。 -
证书创建
CA 根据申请人提交的 CSR 或 预制证书等信息,按照一定的规则和算法,将申请人的身份信息与公钥进行绑定,并使用自己的私钥对证书进行签名,从而创建出数字证书。(如下图)
-
证书发布
CA 将创建好的证书发送给申请人,或者将证书发布到证书库等公开的存储位置,以便用户或设备能够获取到证书并进行使用。 -
证书作废(Certificate Revocation List,证书吊销列表):
当出现证书不再有效或需要撤销的情况时,如用户身份信息变更、私钥泄露等,CA 会将证书标记为作废状态,并通过发布证书吊销列表(CRL)或在线证书状态协议(OCSP)等方式,让其他实体能够查询到证书的作废信息,从而不再信任该证书。
证书的工作流程(细讲)
对CA提供的服务有了解之后,现在可以来谈谈证书的工作流程了。
在公钥基础设施(PKI)中,Bob(服务提供者)、Alice(用户)和CA(证书颁发机构)的角色及证书工作流程如下:
- 角色定义
- Bob:需要向外界证明身份的服务提供者(如网站服务器),持有由CA签发的数字证书。
- Alice:需要验证Bob身份的用户(如客户端)。
- CA:受信任的第三方机构,负责审核Bob身份并签发数字证书。
-
证书工作流程
步骤1:Bob生成密钥对
- Bob生成自己的公私钥对(公钥公开,私钥严格保密)。
步骤2:Bob向CA申请证书
- Bob将公钥、身份信息(如域名、组织信息)提交给CA,请求证书。
步骤3:CA验证Bob身份
- CA通过线下验证(如域名所有权、企业注册信息)确认Bob的身份真实性。
步骤4:CA签发证书
- CA将Bob的公钥、身份信息、有效期、颁发者信息等打包,使用CA的私钥生成数字签名,形成证书。
- 证书格式通常为X.509,包含以下关键信息:
- Bob的公钥
- Bob的身份信息
- 证书有效期
- CA的名称
- 数字签名(由CA私钥加密的哈希值)。
步骤5:Bob使用证书
- Bob将证书部署到服务器,在与Alice通信时(如建立HTTPS连接)发送该证书。
-
Alice如何验证证书?
当Alice收到Bob的证书后,需完成以下验证:步骤1. 检查证书基本信息
- 有效期:确保证书未过期。
- 域名匹配:证书中的域名是否与Bob的实际域名一致(如访问
example.com
时证书是否包含该域名)。
步骤2. 验证证书颁发者(CA)的信任链
- Alice的设备(如浏览器/操作系统)内置了受信任的根CA证书列表。
- 检查Bob的证书是否由其中某个CA直接签发,或通过中间CA(Intermediate CA)签发。若存在中间CA,需验证整个证书链的签名有效性。
步骤3. 验证数字签名
- 提取CA的公钥:从CA的证书(或信任链中的上级证书)中获取公钥。
- 解密签名:用CA的公钥解密证书中的数字签名,得到原始哈希值(Hash1)。
- 重新计算哈希:对证书中Bob的公钥、身份信息等明文内容计算哈希值(Hash2)。
- 对比哈希值:若Hash1 = Hash2,则证明证书未被篡改,且确实由CA签发。
步骤4. 检查证书吊销状态(可选但重要)
- 通过以下方式确认证书未被CA吊销:
- CRL(证书吊销列表):下载CA发布的吊销列表,检查证书是否在其中。
- OCSP(在线证书状态协议):实时向CA查询证书状态。
- 最终信任建立
- 若所有验证通过,Alice确认:
- 证书中的公钥确实属于Bob。
- Bob的身份经过CA严格验证。
- 通信内容可通过Bob的公钥加密(或验证其签名),确保安全通信。
Alice无需直接信任Bob,而是通过信任CA间接建立对Bob的信任,这是PKI的核心思想。
证书链
浏览器上访问一个网站,然后查看一下对方站点的证书,会发现有证书链(证书层次结构) 信息,上面的流程也讲到了证书链,那么这个证书链是干嘛的?怎么运作的呢?
(可以使用证书在线解析工具查看:https://myssl.com/cert_decode.html )
一般是三阶结构,或多阶结构(如果存在多个中间证书交叉链,会导致SSL证书文件变大,加载速度变慢)。
证书链:
证书链就是一个信任体系,是一个循环验证的过程,比如我收到你csdn的证书,你说你是GeoTrust机构认证过的,那我接着怀疑GeoTrust机构的证书有没有问题?GeoTrust机构说我是通过 DigCert机构 认证过的,那我接着问 DigCert机构 的证书就没有问题?
DigCert机构已经在系统初始化的时候就预制了一个根证书在系统证书库了,基本上PKI的流程只能信任到这里了。
你在问,系统预制的证书就牛逼了?就安全了?确实没办法保证哈,毕竟已经出现过预制的证书也会有问题的案例,但是基于成本问题,基本到这里就打住了。
如果无限追溯“谁认证了CA的根证书”,会导致逻辑死循环。因此,PKI的设计必须预设一个信任锚点(Trust Anchor),这是整个体系的基础。用现实世界类比:就像我们默认信任政府签发的身份证,而不需要追溯“谁认证了政府”一样。
验证机制:
当你在浏览器中访问一个网站(例如 *.csdn.net
)并查看其证书层次结构时,浏览器会通过以下步骤验证证书链的完整性和合法性。以下以你提供的证书链为例,具体说明浏览器的验证过程:
证书层次结构示例
- 根证书:
DigiCert Global Root CA
- 中间证书:
GeoTrust CN RSA CA G1
- 叶证书(终端实体证书):
*.csdn.net
- 叶证书(终端实体证书):
- 中间证书:
浏览器的验证流程:
- 接收服务器发送的证书链
- 当访问
*.csdn.net
时,服务器会发送自己的证书(*.csdn.net
)以及中间证书(GeoTrust CN RSA CA G1
),但不会发送根证书(DigiCert Global Root CA
)。 - 根证书通常预置在浏览器或操作系统的受信任根证书存储中。
- 构建证书链
浏览器需要验证从叶证书到根证书的完整信任链:
-
根证书(
DigiCert Global Root CA
)是浏览器本地预置的受信任根证书。- 中间证书(
GeoTrust CN RSA CA G1
)的颁发者是DigiCert Global Root CA
。- 叶证书(
*.csdn.net
)的颁发者是GeoTrust CN RSA CA G1
。
- 叶证书(
构建证书链流程图:
- 中间证书(
-
逐级验证签名
浏览器会从叶证书开始,逐级向上验证每一级证书的签名:
3.1. 验证叶证书(*.csdn.net
)的签名:- 使用中间证书
GeoTrust CN RSA CA G1
的公钥,解密叶证书的数字签名,得到哈希值(Hash1)。 - 重新计算叶证书明文内容(公钥、域名、有效期等)的哈希值(Hash2)。
- 如果 Hash1 = Hash2,则叶证书未被篡改,且由
GeoTrust CN RSA CA G1
签发。
3.2. 验证中间证书(
GeoTrust CN RSA CA G1
)的签名:- 找到根证书
DigiCert Global Root CA
(从本地受信任根证书库中提取)。 - 使用根证书的公钥,解密中间证书的数字签名,得到哈希值(Hash3)。
- 重新计算中间证书明文内容的哈希值(Hash4)。
- 如果 Hash3 = Hash4,则中间证书未被篡改,且由
DigiCert Global Root CA
签发。
验证证书链流程图:
- 使用中间证书
- 验证证书有效性
每一级证书均需检查以下内容:- 有效期: 确保证书未过期(叶证书、中间证书、根证书均需有效)。
- 用途匹配:
- 叶证书的用途必须包含
Server Authentication
(服务器身份验证)。 - 中间证书的用途必须包含
Certificate Authority
(证书颁发机构)。
- 叶证书的用途必须包含
- 域名匹配: 叶证书中的
*.csdn.net
是否覆盖用户访问的域名(如www.csdn.net
)。
- 检查根证书的信任状态
- 根证书
DigiCert Global Root CA
是否在浏览器的受信任根证书列表中?- 是:信任链成立。
- 否:浏览器会提示证书不受信任(例如显示红色警告)。
-
检查证书吊销状态(可选但推荐)
浏览器可能通过以下方式检查证书是否被吊销:
6.1. OCSP(在线证书状态协议):- 向证书中指定的 OCSP 服务器(由 CA 提供)发送查询请求,确认叶证书和中间证书未被吊销。
6.2. CRL(证书吊销列表):
- 下载 CA 发布的吊销列表,检查证书是否在其中。
关键验证点总结
- 信任链完整性:叶证书 → 中间证书 → 根证书必须完整且可追溯。
- 签名合法性:每一级证书的签名必须由其上级证书的公钥验证通过。
- 有效期和用途:所有证书必须有效且用途匹配。
- 根证书预置:根证书必须被浏览器或操作系统信任。
用户可见的结果
- 如果所有验证通过:
- 浏览器地址栏显示锁形图标,点击可查看证书详情。
- 用户与网站建立加密连接(如 HTTPS)。
- 如果验证失败:
- 浏览器显示警告(如
此连接不是私密连接
),阻止用户继续访问。
- 浏览器显示警告(如
技术细节补充
- 中间证书的必要性:
- 根证书通常离线保存,不直接签发终端证书。中间证书用于日常签发,降低根证书泄露风险。
- 证书链传递:
- 服务器需在 TLS 握手时发送叶证书和中间证书,否则浏览器可能无法构建完整链(导致警告)。
- 预置根证书的管理:
- 浏览器和操作系统定期更新受信任的根证书列表(例如通过系统更新)。
通过以上流程,浏览器确保 *.csdn.net
的证书是由可信的 CA(DigiCert)签发的,且证书链未被篡改,拿出公钥进行加密使用,最终建立用户对网站身份的信任。
证书运营机构(CA)
- DigiCert
- Global Sign
- Encrypt
- Let's Encrypt (免费)
总结
证书就类似是一张实体身份证,这个身份证不光只存身份信息,还存这个实体相关的公钥。并且还对公钥和身份信息做了数字签名。
谁为这个公钥和身份信息做签名?
答:CA,CA就像现实的派出所、它对公钥和信息做了签名,就等于发了身份证(数字证书),它还负责帮助其他人去校验这个身份证(证书)是不是属于某个实体。
Reference
《图解密码学技术》
数字证书常见格式整理
https://blog.csdn.net/zhulianhai0927/article/details/106452521