网络通讯安全认证:密钥签名、数字证书与 HTTPS/TLS 流程详解

文章目录

引言

在互联网上,我们每天都在进行各种敏感操作:网购支付、登录邮箱、访问网银……这些操作的数据在传输过程中,如何确保只有目标服务器才能看懂(加密)、数据没有被篡改(完整性)、对方确实是它声称的身份(身份认证)?这一切都依赖于一套精密的网络通讯安全认证体系

本文将从最基础的密钥对(公钥/私钥)数字签名讲起,逐步深入到数字证书的信任链,最后完整梳理 HTTPS/TLS 握手流程,帮你打通从理论到实践的任督二脉。无论你是后端开发者、运维工程师,还是对网络安全感兴趣的初学者,这篇文章都能帮你建立起清晰的知识框架。

一、密钥对(公钥和私钥)和签名的理解

假设有通讯方 A 和通讯方 B 进行加密通讯,双方各自拥有一对密钥:公钥(可公开)和私钥(自己保密)。

1.1 公钥

公钥是可以公开的,主要有两个作用:

  1. 加密数据:如果 A 要向 B 发送数据,A 需要使用 B 提供的公钥对数据进行加密。加密后的数据只有 B 能用自己持有的私钥解密,即使传输途中被截获也无法破解。
  2. 验证签名:当 B 用私钥生成签名后,A 可以用 B 的公钥来验证这个签名是否真的来自 B,从而防止身份伪造。

1.2 私钥

私钥必须严格保密,只有自己持有,一旦泄露,数据安全就无从谈起。私钥主要有两个作用:

  1. 解密数据:当 A 使用 B 的公钥加密数据后,B 用自己的私钥解密,还原原始内容。
  2. 生成签名:B 用私钥对数据生成数字签名,发送给 A 后,A 用 B 的公钥验证签名,确认数据确实来自 B 且未被篡改。

关键区别:公钥加密的数据只能用对应的私钥解密;私钥生成的签名只能用对应的公钥验证。两者互为"搭档",但功能不可互换。

私钥的格式如下:

-----BEGIN PRIVATE KEY-----
MIGTAgSDFSDFSDFDSCSDFDSFDSFEHBHkwdwIBAQQg55Buo2jTJYs2Fmsj
IGcryPcjT4JeD
-----END PRIVATE KEY-----

公钥的格式如下:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzsdaAQYIKoZIz3233QcDQgAE6Xmz1Hi60GBcUYrvuYEr1K9sauPC
p5799jp5xNsdfLk4C05asdsadasfdP4+mgNzmgNz0xGEOltrOndxxaw==
-----END PUBLIC KEY-----

1.3 签名

签名可以理解为传统世界里的手写签名——它在数字通讯中承担着身份认证完整性校验两个关键作用。

核心问题:A 向 B 发了一段数据,B 如何确定这段数据确实来自 A(而非他人伪造),以及数据在传输途中是否被篡改或丢失?答案就是附带一份由 A 的私钥生成的签名

签名的生成与验证流程

生成(A 端):

  1. A 对原始数据(待发送的内容)进行哈希计算,得到一串固定长度的哈希值(又称摘要)
  2. A 用自己的私钥对哈希值进行加密(即"签名"),加密结果就是数字签名
  3. A 将「原始数据 + 签名」一同发送给 B

验证(B 端):

  1. B 用 A 之前提供的公钥对签名进行解密——若解密成功,得到一串哈希值,说明该签名确实由 A 的私钥生成,从而确认数据来自 A(身份认证);若解密失败,说明签名并非来自 A
  2. 同时,B 在本地对收到的原始数据做同样的哈希计算,得到另一串哈希值
  3. B 将两个哈希值对比:
    • 一致 → 数据在传输中未被篡改(完整性校验
    • 不一致 → 数据已被篡改或损坏

签名验证流程

A 生成数据

A 用自己的私钥生成签名

A 发送数据 + 签名给 B

B 接收数据 + 签名

B 用 A 的公钥验证签名

验证通过,确认数据来源和完整性

加密通讯流程

A 生成数据

A 用 B 的公钥加密数据

A 发送加密数据给 B

B 接收加密数据

B 用自己的私钥解密数据

二、证书的理解

既然有了公钥和私钥,并且有签名,那证书又是什么,为什么需要证书?

其实,有了公钥和私钥就能通讯,但怎么证明这个公钥就是对方给你的呢?万一对方给了一个假的公钥给你,然后你用假公钥加密数据,那么对方就可以伪造发送方和你进行数据通讯了。所以我们需要一个证明——证明这个公钥确确实实是对方给的,这个时候证书就有了存在的意义。

2.1 关于证书是哪里来的

证书来源于证书颁发机构(CA,Certificate Authority),一般来说需要经过申请、验证和签发三个步骤。

  1. 生成本地密钥对:首先准备自己本地生成的密钥对(公钥和私钥)
  2. 提交 CSR 文件:提交证书签名请求(CSR,Certificate Signing Request)文件。CSR 主要包含了申请者的身份信息(如域名、组织名称)、公钥,以及用申请者私钥对这些信息的签名(用于证明公钥的归属)
  3. CA 验证申请者身份:CA 收到 CSR 后,会根据证书类型进行身份验证
  4. CA 签发证书:验证通过后,CA 就会签发证书(通常为 PEM、DER 等格式,文件后缀可能是 .crt、.pem、.cer),证书里面同时包含了用 CA 的私钥生成的签名(防止证书被篡改)

通过

失败

开始证书申请

生成本地密钥对

创建CSR文件

向CA提交CSR申请

CA验证申请者身份

验证结果

CA签发证书
含公钥,CA签名,身份信息

CA拒绝申请

获得合法证书

2.2 怎么证明这个证书是真正的证书还是伪造的证书?

就算是 CA,作为"网络世界的公证人",也需要被证明自己的身份。这个时候就会有一个叫根证书的东西,它是 CA 的自签名证书,需要预装在本地的证书库中。这样当你用根证书的公钥就能够验证其他证书是否来源于 CA。当然,前提是你预装的根证书是可信赖的。如果根证书被篡改,整个信任体系将彻底崩溃。

2.3 证书的格式

这里做了删减,可以自行去网站生成一个证书查看完整内容。

-----BEGIN CERTIFICATE-----
MIICVTCCAfugAwIBAgIQeHl2eqx5QSqdnHrO0JsTkjAKBggqhkjOPQQDAjA8MQsw
CQYDVQQGEwJLUjENsdfsdfdsfdsffdfdfddsAsGA1UECwwES0VDTzEPMA0GA1UES
AwwGUm9vdENBMB4XDTI1MDgxMTAyMjUxMFoXDTM1MDgwOTAyMjUwOVowVjELMAkG
A1UEBhMCS1IxCzAJBgNVBAoMAlBMMQ8wDQYDVQQLDAYwMzA2NTYxFDASBgoJkiaJ
k/IsZAEZFgRFVlNFMRMwEQYDVQQDDApQTDAzMDY1NjAwMFkwEwYHKoZIzj0CAQYI
/sYIaOD1QToxwzAiAOGM0GV12f7N13Kq/yFoS/YpJP7pi0XtCsGfZja1qWJA==
-----END CERTIFICATE-----

2.4 可用的证书在线解析网站推荐

  1. 证书解析网站
  2. 也可以使用 openssl 工具进行命令解析

2.5 证书链、中间证书、服务器证书、根证书的理解

由中间CA的私钥签名

由根CA的私钥签名

预装在系统/浏览器中

服务器证书

中间证书

根证书

信任源头

2.5.1 证书链、中间证书、服务器证书、根证书的关联

当访问某个网站或者服务器的时候,对方会给过来一个服务器证书(即网站的终端证书),然后浏览器根据证书中的颁发者信息逐级向上查找。若寻找到对应的上级证书——中间证书,则进行校验比对;倘若校验无误,继续根据该中间证书查找它的上一级证书——根证书,同样进行校验比对。若全部通过,即可证明访问的对象是正确的,没有被篡改。这整个的一条链路——服务器证书 → 中间证书 → 根证书——就叫做一个证书链

2.5.2 既然可以从根证书到服务器证书,为什么还需要中间证书?
  1. 分散签发压力,减少吊销压力,提升证书签发效率:例如某个服务器证书出现问题,需要上级 CA 进行吊销。假如全部由根 CA 去吊销,压力巨大;而且签发流程复杂又耗时,假如全部由根 CA 去处理,根本处理不过来。
  2. 更好地避免根证书私钥泄露:根证书只要签发一小部分中间证书,然后就直接封存、不再签发,后续由中间证书的私钥去签发其他的中间证书或服务器证书。如果一直用根证书去签发,随着证书数量剧增,私钥的暴露风险会越来越大。

这个机制类似现实中的"政府授权体系":

  • 根 CA 相当于"中央政府",拥有最高权威,但不会直接给每个公民发证件(太繁琐且风险高)
  • 中间 CA 相当于"地方政府/职能部门",由中央政府授权后,负责给当地居民或特定群体签发证件(如身份证、营业执照)
  • 中央政府只需管好地方政府的授权(签发中间 CA 证书),地方政府再负责具体证件的签发,安全又高效

签发

签发

签发

签发

签发

根证书

中间证书1

中间证书2

中间证书N

服务器证书1

服务器证书N

2.5.3 证书之间是如何验证的?

证书之间的验证原理与前面介绍的签名验证原理相同。

根 CA 本身有一对密钥(公钥和私钥),它的下级 CA(例如中间 CA)的证书,是由根 CA 的私钥来签发的。所以当根证书需要验证中间 CA 证书时,可以通过根 CA 的公钥去验证中间 CA 证书上的签名。这样就能够确认中间 CA 的确是由根 CA 所签发,而不是其他人伪造篡改的。

中间CA层级

根CA层级

用私钥签发

嵌入

提取

提取

解密验证

验证结果

根CA密钥对
根CA私钥#保密#
根CA公钥包含在根证书中

根证书
内置根CA公钥
自签名验证

中间CA证书的签名
由根CA私钥生成

中间CA证书

根CA公钥

确认中间CA证书
未被篡改
确由根CA签发

2.5.4 证书是如何被吊销的?

CA 可因多种原因吊销证书,如密钥泄露、CA 系统被攻击、证书持有者从属关系改变、证书被取代、业务终止等。

吊销查询方式一般有两种:

  1. 通过证书吊销列表(CRL)查询:证书中通常包含 CRL 的下载 URL,下载后通过序列号查询是否存在吊销记录
  2. 通过在线证书状态协议(OCSP)查询:证书中通常包含 OCSP 的查询 URL,实时查询证书状态

三、HTTPS 通讯流程(TLS/SSL)

通过对 HTTPS 的通讯加密流程的梳理,可以更清楚地了解数字证书在 TLS 里的作用。

我们平时在浏览器中访问网站时,如果网址以 https:// 开头,说明传输层使用了 TLS/SSL 加密通讯。此时即使抓包,看到的也是乱码。下面以访问一个 HTTPS 网站为例,描述完整的通讯流程。

通讯过程

当我们在浏览器上输入一串 URL 时,背后发生了以下流程:

1. 根据 URL 上的域名通过 DNS 获取实际的 IP 地址

浏览器向 DNS 服务器查询域名对应的 IP 地址,找到目标服务器。

2. 使用 TCP 进行连接(三次握手)

浏览器与目标服务器建立 TCP 连接,确保可靠的传输通道。

3. 建立 TLS 连接(握手阶段)

这是 HTTPS 的核心环节,负责身份验证和密钥协商。下面分步骤说明:

步骤 1:客户端发起握手请求(Client Hello)

浏览器向服务器发送 Client Hello 消息,包含以下内容:

  1. 支持的 TLS 版本(如 TLS 1.3、TLS 1.2)
  2. 支持的加密套件列表(按优先级排序,如 ECDHE-ECDSA-AES256-GCM-SHA384,其中包含了密钥交换算法、对称加密算法和哈希算法)
  3. 客户端生成的随机数 A(32 字节,用于后续密钥计算,防止重放攻击)

为什么需要随机数? 如果每次握手都使用固定的密钥,攻击者可以重放之前的加密数据来欺骗服务器。随机数确保了每次握手生成的密钥都是独一无二的。

步骤 2:服务器回应并发送身份凭证(Server Hello + 证书链)

服务器收到 Client Hello 后,回复 Server Hello 消息,包含:

  • 选定的 TLS 版本和加密套件(从客户端列表中选择双方都支持的最优方案)
  • 服务器生成的随机数 B(32 字节,与随机数 A 共同参与密钥计算)
  • 核心操作:发送证书链——包含服务器证书(即网站的终端证书)以及签发该证书的中间证书(注意:这里发送的是服务器证书,而非"客户端证书"——客户端证书仅在双向认证场景使用,如银行 U 盾登录)
步骤 3:浏览器验证证书链(核心安全校验)

浏览器收到证书链后,逐级验证,确保对方是"真实的目标服务器":

验证服务器证书:

  1. 从服务器证书中提取"颁发者信息"(即签发该证书的中间 CA)
  2. 用中间证书的公钥解密服务器证书上的数字签名,得到一串哈希值
  3. 同时对服务器证书的内容(不含签名部分)做同样的哈希计算
  4. 对比两个哈希值:一致 → 服务器证书未被篡改且确由该中间 CA 签发

验证中间证书:

  1. 从中间证书中提取"颁发者信息"(即签发它的上级 CA,可能是更高级的中间 CA 或根 CA)
  2. 用上级 CA 的公钥(若为根 CA,则使用浏览器/系统预装的根证书公钥)解密中间证书的签名
  3. 重复上述哈希对比流程,逐级追溯,直到验证至根证书(根证书自带信任,无需其他证书验证)

⚠️ 注意:若验证过程中任何一步失败,浏览器会弹出"网站不安全"警告,阻止继续访问。

验证通过后,进入步骤 4。

步骤 4:密钥交换与会话密钥生成(以 ECDHE 算法为例)

证书验证通过后,双方通过非对称加密协商一个临时的"共享密钥",过程如下:

服务器发送密钥交换参数:

  • 服务器生成椭圆曲线(EC)的公钥参数,通过 Server Key Exchange 消息发送给客户端
  • 服务器使用自己的私钥对该参数签名(防止中间人篡改)

客户端生成并交换密钥参数:

  • 浏览器生成自己的 EC 私钥和对应的公钥参数
  • 基于服务器的 EC 公钥参数和自己的 EC 私钥,通过 ECDHE 密钥协商算法计算出共享密钥(双方会得到完全相同的共享密钥,且无需在网络中传输该密钥本身)
  • 客户端将自己的 EC 公钥参数发送给服务器(Client Key Exchange 消息)

双方共同生成会话密钥:

  • 服务器收到客户端的 EC 公钥参数后,用自己的 EC 私钥计算出相同的共享密钥
  • 双方结合之前的随机数 A随机数 B共享密钥,通过 PRF(伪随机函数)生成主密钥,再从主密钥中派生出具体的会话密钥(如用于对称加密的 AES 密钥、用于完整性校验的 GCM 密钥等)

关键区别:共享密钥是 ECDHE 算法协商出的临时密钥,用于派生后续的会话密钥;会话密钥才是实际加密通讯数据的密钥。

步骤 5:握手结束确认
  1. 客户端生成 Client Finished 消息(包含整个握手过程的摘要信息),用会话密钥加密后发送给服务器
  2. 服务器生成 Server Finished 消息(同样包含握手摘要),用会话密钥加密后回应
  3. 双方解密并验证对方的 Finished 消息:若解密成功且摘要匹配,说明会话密钥协商有效,TLS 握手完成

Finished 消息的作用:它相当于握手阶段的"最终确认"——如果双方都能用会话密钥正确加密和解密握手摘要,说明密钥协商没有出错,后续通讯可以安全进行。

步骤 6:通讯加密

握手成功后,浏览器和服务器就可以使用协商好的会话密钥对后续的 HTTP 数据进行对称加密通讯了。此时抓包看到的将是密文,无法直接读取内容。

四、总结与核心概念对比

通过以上梳理,可以看到 HTTPS 的安全保障并非依赖单一技术,而是非对称加密、对称加密、哈希算法三者协同工作的结果。下面用一个表格来总结它们在 HTTPS 中的角色:

技术类型代表算法在 HTTPS 中的角色特点
非对称加密RSA、ECDSA证书签名验证、密钥交换(如 ECDHE)安全但慢,适合小数据量
对称加密AES-GCM、ChaCha20实际通讯数据的加密速度快,适合大数据量
哈希算法SHA-256、SHA-384签名生成前的摘要计算、完整性校验不可逆,固定长度

一句话总结 HTTPS 的安全逻辑:

非对称加密(证书 + 密钥交换)安全地协商出一个临时的对称密钥,然后用这个对称密钥高效地加密后续的所有通讯数据。

五、常见问题与误区

Q1:公钥加密和数字签名有什么区别?

这是初学者最容易混淆的概念。简单来说:

  • 公钥加密:用对方的公钥加密数据,确保只有对方能用私钥解密 → 目的是保密性
  • 数字签名:用自己的私钥对数据摘要加密,对方用你的公钥验证 → 目的是身份认证 + 完整性

一句话记忆:公钥加密,别人看不懂;私钥签名,别人伪造不了。

Q2:HTTPS 一定是单向认证吗?什么时候需要双向认证?

  • 单向认证(最常见):只有服务器发送证书给客户端验证,客户端不需要提供证书。例如访问百度、淘宝等普通网站。
  • 双向认证(mTLS):服务器和客户端互相发送证书验证。常见于银行 U 盾登录、企业内部微服务间通讯、API 网关认证等场景。

Q3:TLS 1.2 和 TLS 1.3 的主要区别是什么?

对比项TLS 1.2TLS 1.3
握手次数2-RTT(两次往返)1-RTT(一次往返),甚至 0-RTT(会话恢复)
密钥交换支持多种算法(RSA、DH、ECDH 等)仅支持 PFS(完美前向保密)算法,如 ECDHE
加密套件复杂,包含多种组合简化,仅支持 AEAD 加密(如 AES-GCM)
安全性部分旧算法存在漏洞(如 RSA 密钥交换无 PFS)默认更强,移除了不安全算法

PFS(完美前向保密):即使服务器的私钥泄露,也无法解密之前记录的加密通讯内容。TLS 1.3 强制使用 PFS 算法。

Q4:什么是自签名证书?为什么浏览器不信任它?

自签名证书就是自己给自己签发的证书,没有经过 CA 的验证。浏览器不信任它,是因为它不在系统预装的根证书库中,无法形成可追溯的信任链。自签名证书通常用于内部测试环境局域网通讯,生产环境必须使用 CA 签发的证书。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐