Day 8-3 HTTP 协议与 HTTPS/TLS(认知)

Day 8-3 HTTP 协议与 HTTPS/TLS(认知) 目标 说明 理解 HTTP 协议 掌握请求/响应结构、请求方法、状态码、常用头部 理解 Cookie 与 Session 掌握会话保持的原理、区别以及运维关注点 理解 HTTPS/TLS 掌握对称/非对称加密的分工、TLS 握手流程、证书

Day 8-3 HTTP 协议与 HTTPS/TLS(认知)

目标 说明
理解 HTTP 协议 掌握请求/响应结构、请求方法、状态码、常用头部
理解 Cookie 与 Session 掌握会话保持的原理、区别以及运维关注点
理解 HTTPS/TLS 掌握对称/非对称加密的分工、TLS 握手流程、证书链验证
会用工具验证 使用 curl -v 和浏览器 F12 查看 HTTP/HTTPS 通信细节

一、HTTP 协议基础

1.1 什么是 HTTP?

HTTP(HyperText Transfer Protocol,超文本传输协议)= 浏览器和服务器之间的“聊天语言”。它定义了客户端怎么问、服务器怎么答。

HTTP 是一个基于 TCP/IP 通信协议来传递数据的协议(HTML 文件、图片文件、查询结果、视频、安装包等)。

HTTP 客户端通过 GET /index.html 请求资源,服务器通过 HTTP Response 返回响应

回顾 OSI 七层模型与 TCP/IP 四层模型:

  • HTTP 处于应用层。
  • 依赖于传输层的 TCP 协议(默认端口 80),确保可靠传输。
  • 依赖于网络层的 IP 协议,实现寻址和路由。

HTTP 协议工作于客户端——服务端架构上(Client-Server)。浏览器作为 HTTP 客户端,通过 URL 向 HTTP 服务端(即 WEB 服务器)发送所有请求。

基本通信流程:

浏览器发送请求,Web 服务器返回响应

1.2 HTTP 三大特点

1.2.1 无连接

无连接是指:在 HTTP 的原始设计中,每次请求结束后,服务器都会主动断开 TCP 连接。

这背后是早期 Web 访问量小、页面简单的时代背景。每次请求都建立/断开连接,对服务器来说实现简单、资源清理干净。

每次请求结束后断开连接,下一个请求建立新连接

Nginx 的 keepalive_timeout 在做什么?

keepalive_timeout 65;

保持连接空闲 65 秒,后续请求可复用连接

提示:服务器在处理完一个请求后,不立即断开 TCP 连接,而是保持连接空闲等待 65 秒。如果 65 秒内同一个客户端发来新请求,则复用这条连接。

HTTP 协议说“我默认不保持连接”,Nginx 说“但我要保持 65 秒”。前者是协议标准,后者是对标准的工程优化。

1.2.2 媒体独立

媒体独立是指:只要客户端和服务器知道如何处理数据内容,任何类型的数据都可以通过 HTTP 传输。

HTTP 可传输 HTML、图片、视频、JSON、安装包等类型

1.2.3 无状态

无状态是指:HTTP 协议对事务处理没有记忆能力。每次请求都是独立的,服务器不会自动保留任何之前请求的信息。

POST /login 登录成功

GET /orders 没有携带身份标识,服务器要求先登录

无状态的含义:

维度 说明
不记忆 服务器处理完请求后,不会保留任何关于该请求的状态信息
不关联 两个请求之间没有任何关联,即使来自同一个客户端、间隔仅 1 秒
不识别 服务器无法仅凭 HTTP 协议本身判断两个请求是否来自同一个用户

无状态导致的问题:

即使用户刚刚登录成功,下一次请求时,服务器也不知道“你是谁”。因为:

请求 服务器看到的内容 服务器知道什么
第 1 次:POST /login 账号:admin,密码:123 这个请求在尝试登录
第 2 次:GET /orders 只有路径 /orders,没有身份信息 这个请求来自谁?不知道。→ 请先登录

每次请求独立,需通过 Cookie/Session 记住用户

一个页面加载多个资源的场景:

用户打开一个页面,浏览器会并行发起多个请求(HTML、CSS、JS、图片 1、图片 2、图片 N):

页面的多个资源请求可由负载均衡器分配到不同服务器

结论:无状态是 Web 服务器能够水平扩展(横向扩容)的基础。 因为服务器不保存用户状态,请求可以被分配到集群中的任意一台服务器上处理。这也是为什么 Session 必须集中存放到 Redis,让应用服务器变成“无状态”的。

1.3 HTTP 请求与响应结构

HTTP 报文分为请求报文和响应报文,均由三部分组成:

  1. 起始行——描述请求或响应的基本信息。
  2. 首部字段——包含协议的附加信息,以键值对形式表示。
  3. 消息正文——实际传输的数据,可为空。

1.3.1 客户端请求报文

客户端发送一个 HTTP 请求到服务器的请求消息包括以下格式:

请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

curl -v 请求报文:请求行、请求头、空行、请求体

# POST 方法测试
[root@yangge ~]# curl -v -X POST https://postman-echo.com/post \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"123456"}'
> POST /post HTTP/2
> Host: postman-echo.com
> User-Agent: curl/8.12.1
> Accept: */*
> Content-Type: application/json
> Content-Length: 40
>
* upload completely sent off: 40 bytes
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
< HTTP/2 200
< date: Wed, 29 Jul 2026 14:46:30 GMT
< content-type: application/json; charset=utf-8
< content-length: 359
< etag: W/"167-uifdlbAzM0m0MLvoYA8WO0Wyjl8"
< vary: Accept-Encoding
< x-envoy-upstream-service-time: 5

1.3.2 服务器响应报文

HTTP 响应也由四个部分组成:

状态行、消息报头、空行和响应正文。

curl -v 响应报文中的状态行、响应头和空行

图中响应体示例(底部水印区域裁去后,原有内容补录于此):

<a href="https://www.baidu.com/">Moved Permanently</a>.

响应体就是实际传输的数据内容,例如 HTML。

1.4 HTTP 请求方法

HTTP/1.1 定义了多种请求方法,以下是运维必须掌握的 6 个核心方法:

方法 含义 是否幂等 使用场景
GET 获取资源 ✅ 是 查看列表、查看详情、下载文件
POST 提交数据 ❌ 否 创建订单、登录提交、发表评论
PUT 全量更新 ✅ 是 更新完整用户信息、替换文件
PATCH 部分更新 ❌ 否 只修改手机号、只修改状态
DELETE 删除资源 ✅ 是 删除用户、删除文件
OPTIONS 预检请求 ✅ 是 跨域请求前的探测、查询服务器支持的方法

关于幂等性:

幂等性 = 多次执行同一操作,产生的结果相同。

  • GET、PUT、DELETE 都是幂等的 → 可以安全地重试。
  • POST 不是幂等的 → 重试可能产生两个订单、两条评论。

运维视角:设计 POST 接口时必须做“防重提交”处理,否则用户双击提交按钮会产生两条重复数据。

1.5 HTTP 状态码

1.5.1 常见状态码

HTTP 状态码由三个十进制数字组成,第一个数字定义了状态码的类型:

分类 范围 含义
1xx 100–199 信息提示,请求已被接收,继续处理
2xx 200–299 成功,请求已被成功接收、理解并接受
3xx 300–399 重定向,需要客户端进一步操作以完成请求
4xx 400–499 客户端错误,请求包含语法错误或无法完成
5xx 500–599 服务器错误,服务器无法完成合法请求

运维必知的高频状态码:

状态码 含义 详细说明与举例
200 请求成功 服务器成功处理请求并返回了数据。示例:浏览器访问 https://www.jd.com,服务器返回首页 HTML,状态码 200。
301 永久重定向 资源永久迁移到了新地址,浏览器会缓存这个跳转,下次直接访问新地址。示例:http://jd.com → 301 → https://www.jd.com,浏览器以后访问 HTTP 时会自动跳转到 HTTPS。
302 临时重定向 资源临时移动到新地址,浏览器不会缓存,每次仍需访问原地址。示例:未登录用户访问 /orders → 302 → /login,浏览器不会缓存这个跳转,下次访问 /orders 时仍会先发请求。
304 未修改(缓存命中) 资源未修改,浏览器可以用本地缓存。示例:第一次访问 style.css 返回 200,响应头带 ETag: "abc123"。第二次请求时浏览器发送 If-None-Match: "abc123",服务器发现资源未修改 → 返回 304(响应体为空),浏览器直接使用本地缓存。
400 请求语法错误 服务器无法理解请求,通常是参数格式不对。示例:POST 请求要求 JSON 格式,但 Content-Type 写成了 text/plain,或者 JSON 语法错误(多了一个逗号)。
401 未认证 请求需要用户身份验证。示例:访问需要登录的 API,但请求头中没有携带 Authorization: Bearer <token>,或 Cookie 中没有 JSESSIONID。
403 禁止访问 服务器理解请求,但拒绝执行。示例:访问 /admin 页面,但你的 IP 不在允许列表中;或 Linux 文件权限为 600,Nginx 无法读取该文件。
404 资源不存在 服务器找不到请求的资源。示例:浏览器访问 https://www.magedu.com/yangge.html,但服务器上根本没有这个文件,返回 404。
429 请求过多(限流) 客户端在限定时间内发送了太多请求。示例:登录接口限制每分钟最多 5 次,你连续点击了 10 次登录按钮,服务器返回 429 并提示“请稍后再试”。
500 服务器内部错误 服务器代码执行出错。示例:Java 的 NullPointerException,或 Python 的 KeyError。排障:立即查看后端应用日志。
502 网关错误 网关(如 Nginx)从后端服务器收到了无效响应。示例:Nginx 将请求转发给 Tomcat(端口 8080),但 Tomcat 服务挂了,Nginx 无法连接 → 返回 502。
503 服务不可用 服务器过载或正在维护。示例:网站流量暴涨,超过了服务器负载能力,或运维人员正在停机维护,返回 503。
504 网关超时 网关等待后端服务器响应超时。示例:Nginx 设置 proxy_read_timeout 60s,但后端处理请求耗时超过 60 秒(如数据库慢查询),Nginx 返回 504。

容易混淆的两组状态码 301 vs 302:

对比 301 302
浏览器行为 缓存跳转,下次直接访问新地址 不缓存,每次都先访问原地址再跳转
举例 http://jd.com → https://www.jd.com(永远如此,用 301 让浏览器记住) 未登录 → 登录页(每次都要判断登录状态,用 302)

1.5.2 测试案例一:200 请求成功

[root@yangge ~]# curl -I https://www.jd.com
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 29 Jul 2026 11:08:54 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 191209
Connection: keep-alive
Cache-Control: max-age=120
Expires: Wed, 29 Jul 2026 11:10:00 GMT

1.5.3 测试案例二:301 永久重定向

[root@yangge ~]# curl -I jd.com
HTTP/1.1 301 Moved Permanently
Date: Wed, 29 Jul 2026 11:04:08 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://www.jd.com
Server: jfe
Cache-Control: no-cache

[root@yangge ~]# curl -v jd.com
* Host jd.com:80 was resolved.
* IPv6: (none)
* IPv4: 106.39.171.134, 211.144.24.218, 211.144.27.126, 111.13.149.108
*   Trying 106.39.171.134:80...
* Connected to jd.com (106.39.171.134) port 80
* using HTTP/1.x
> GET / HTTP/1.1
> Host: jd.com
> User-Agent: curl/8.12.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 301 Moved Permanently
< Date: Wed, 29 Jul 2026 10:57:00 GMT
< Content-Type: text/html
< Content-Length: 178
< Connection: keep-alive
< Location: https://www.jd.com
< Server: jfe
< Cache-Control: no-cache

1.5.4 测试案例三:302 临时重定向

[root@yangge ~]# curl -I https://postman-echo.com/status/302
HTTP/2 302
date: Wed, 29 Jul 2026 11:16:22 GMT
content-type: application/json; charset=utf-8
content-length: 14
etag: W/"e-81YCV6LzGcGN2+vhBJCJku78JQY"
vary: Accept-Encoding
x-envoy-upstream-service-time: 5
cf-cache-status: DYNAMIC

1.5.4 测试案例三:304 缓存命中

[root@yangge ~]# curl -I https://postman-echo.com/status/304
HTTP/2 304
date: Wed, 29 Jul 2026 15:12:33 GMT
etag: W/"e-yKIv+EWfjBvzq4aQf7hqeeQWS/I"
x-envoy-upstream-service-time: 6
cf-cache-status: DYNAMIC
set-cookie: sails.sid=s%3A7vi1tZEfe2kSzlaZThq1b3zVnGZIil6X.EnEVHh6tQ%2Fm76v1WGbuNfxllFliHt5Y8Qh6l6AQ%2BDb8; Path=/; HttpOnly

1.5.5 测试案例四:403 禁止访问

[root@yangge ~]# curl -I https://postman-echo.com/status/403
HTTP/2 403
date: Wed, 29 Jul 2026 11:15:02 GMT
content-type: application/json; charset=utf-8
content-length: 14
etag: W/"e-wN+xT2c5ZvCPo0YIdQiMpDVsb6o"
vary: Accept-Encoding
x-envoy-upstream-service-time: 6
cf-cache-status: DYNAMIC

1.5.6 测试案例五:404 资源不存在

[root@yangge ~]# curl -I https://postman-echo.com/yangge.html
HTTP/2 404
date: Wed, 29 Jul 2026 11:13:26 GMT
content-type: application/json; charset=utf-8
vary: Accept-Encoding
x-envoy-upstream-service-time: 5
cf-cache-status: DYNAMIC

1.5.7 测试案例六:502 网关错误

Nginx 网关因后端服务挂掉或端口不通返回 502 Bad Gateway

[root@yangge ~]# curl -I https://postman-echo.com/status/502
HTTP/2 502
date: Wed, 29 Jul 2026 11:21:18 GMT
content-type: text/plain; charset=UTF-8
content-length: 16
cache-control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
expires: Thu, 01 Jan 1970 00:00:01 GMT
referrer-policy: same-origin
x-frame-options: SAMEORIGIN

1.6 常用请求头与响应头

1.6.1 常见请求头

头部 含义 示例 说明
Host 目标主机域名 Host: www.magedu.com HTTP/1.1 必须携带,用于在一台服务器上区分多个网站
User-Agent 客户端标识 User-Agent: Mozilla/5.0... 标识浏览器类型、版本、操作系统
Accept 可接受的响应格式 Accept: application/json 告诉服务器客户端期望返回什么格式
Content-Type 请求体格式 Content-Type: application/json POST/PUT/PATCH 请求中告知服务端请求体的编码格式
Authorization 认证凭证 Authorization: Bearer eyJhbG... 携带 JWT Token 或 Basic Auth 凭证
Cookie 携带 Session ID Cookie: JSESSIONID=abc123 浏览器自动携带,用于会话保持
Cache-Control 缓存策略 Cache-Control: no-cache 控制缓存行为

1.6.2 常见响应头

头部 含义 示例 说明
Content-Type 响应体格式 Content-Type: text/html; charset=utf-8 告知浏览器如何解析响应内容
Content-Length 响应体大小 Content-Length: 1024 响应体的字节数
Location 重定向目标 Location: https://new.magedu.com 配合 301/302 使用,指定跳转地址
Set-Cookie 设置 Cookie Set-Cookie: sessionId=xxx; HttpOnly; Secure 服务端下发 Cookie 给客户端
Cache-Control 缓存策略 Cache-Control: max-age=3600 告诉浏览器缓存多久(单位:秒)
Server 服务器软件信息 Server: nginx/1.28.0 标识 Web 服务器类型和版本
X-Frame-Options 防点击劫持 X-Frame-Options: DENY 禁止页面被嵌入 iframe
X-Content-Type-Options 防 MIME 嗅探 X-Content-Type-Options: nosniff 禁止浏览器自动推断文件类型

HTTP 是无状态协议——每次请求都是独立的,服务器不记得你是谁。但网站需要记住用户的登录状态,于是有了 Cookie 和 Session 机制。

对比维度 Cookie Session
存储位置 浏览器端(客户端的硬盘或内存中) 服务器端(内存、文件、Redis、数据库)
大小限制 约 4KB(浏览器限制) 无大小限制(受服务器内存或存储限制)
安全性 较低(可被窃取、篡改) 较高(存储在服务端,客户端只拿到 ID)
生命周期 可设置过期时间(Expires/Max-Age) 由服务端控制,通常 30 分钟空闲超时
典型用途 记住登录状态、前端偏好设置、埋点数据 存储用户身份、权限信息、购物车数据

1.7.3 会话保持的完整流程

  1. 用户提交账号密码 → 服务器验证通过。
  2. 服务器创建 Session(存储用户身份、权限等信息),生成唯一的 Session ID。
  3. 服务器通过 Set-Cookie 响应头将 JSESSIONID=xxx 下发给浏览器。
  4. 浏览器将 Session ID 保存在 Cookie 中。
  5. 后续每次请求,浏览器自动通过 Cookie 请求头携带 Session ID。
  6. 服务器根据 Session ID 找到对应的 Session 数据 → 识别用户身份。

浏览器与服务器间通过 Cookie 和 Session 保持会话的完整流程

1.7.4 生产环境 Session 存储问题

Session 存储问题:

  • 单机环境:Session 存本地内存(默认)或文件 → 没问题。
  • 负载均衡环境(多台服务器):Session 必须集中存储(Redis/数据库),否则用户在 A 服务器登录后,请求落到 B 服务器时 B 没有该 Session,用户会被踢出登录。

方案一:负载均衡 + Session 存储本地(❌ 错误方式)

本地 Session 只存在服务器 A,请求分配到 B 时没有会话数据

问题:用户在服务器 A 登录成功,Session 存在 A 的本地内存中。第二次请求被负载均衡器分配到服务器 B,B 的本地没有该用户的 Session → 用户被踢出登录。

方案二:负载均衡 + Session 集中存储(✅ 正确方式)

图 1:登录——Session 写入 Redis。

登录成功后 Session 写入 Redis

图 2:查询订单——从 Redis 读取 Session。

请求落到另一台服务器时从 Redis 读取 Session

解决方案:Session 统一存放到 Redis(或数据库)中。无论用户请求落到哪台服务器,都能从 Redis 读取到相同的 Session 数据 → 用户会话保持。

对比总结:

方式 存储位置 负载均衡效果 结果
❌ 本地存储 各自服务器的内存/文件 用户被绑定到单台服务器 请求落错服务器 → 被踢出登录
✅ 集中存储 Redis / 数据库 任意服务器均可处理 会话始终保持

二、HTTPS 与 TLS

2.1 为什么需要 HTTPS?

HTTP 是明文传输的——中间的任何人都能看到通信内容(密码、Token、业务数据)。

HTTP 明文传输与 HTTPS 加密传输的对比

HTTP(上图):yangge 发送的密码在网络中以明文传输,任何中间人都能看到。

HTTPS(下图):yangge 发送的密码经过加密后再传输,中间人无法解读。

HTTPS = HTTP + TLS(传输层安全协议)。

HTTPS 并不是一个新的应用层协议,而是在 HTTP 和 TCP 之间插入了一层 TLS 加密层,对传输的所有数据进行加密。

2.2 对称加密 vs 非对称加密

对比维度 对称加密 非对称加密
密钥 加密和解密使用同一把密钥 加密使用公钥(可公开),解密使用私钥(保密)
速度 快(适合加密大量数据) 慢(比对称加密慢 100 倍以上)
代表性算法 AES、ChaCha20、DES RSA、ECC(椭圆曲线)
用途 加密实际传输的数据 安全地传递对称加密的密钥

对称加密:同一把密钥加密与解密

图中文字:plaintext(明文)→ encryption(加密)→ ciphertext(密文)→ decryption(解密)→ plaintext(明文)。

非对称加密:公钥加密、私钥解密

公钥(public key)可公开,私钥(private key)需保密。

2.2.1 为什么 HTTPS 需要两种加密结合?

方案 问题
只用对称加密 密钥无法安全地传递给对方(传递密钥本身不加密,会被窃取)
只用非对称加密 速度太慢,加密大量数据时性能极差
两者结合(HTTPS 的方案) 非对称加密负责安全传递“对称密钥” → 对称加密负责快速加密所有数据

2.2.2 使用的流程

  1. 客户端和服务器在握手阶段使用非对称加密(RSA/ECC)安全地交换一个临时的对称密钥(Pre-Master Secret 衍生)。
  2. 双方用这个对称密钥派生出会话密钥。
  3. 后续所有 HTTP 数据都使用对称加密(AES)加密传输 → 又快又安全。

2.3 TLS 握手流程(TLS 1.2)

TLS 握手是客户端与服务器建立加密通道的过程,TLS 1.2 需要 2 次 RTT(往返时间)。

TLS 1.2 的协议协商、服务器身份验证、密钥交换、生成会话密钥、加密通信流程

2.3.1 握手步骤详解

步骤 说明
1. ClientHello 客户端发送:支持的 TLS 版本、加密套件列表、一个随机数(Client Random)
2. ServerHello 服务器回应:选定的加密套件、一个随机数(Server Random)、服务器证书(含公钥)
3. 客户端验证证书 浏览器验证证书链(域名匹配、有效期、签发者可信、未吊销)
4. 密钥交换 客户端生成 Pre-Master Secret,用服务器公钥加密后发送给服务器
5. 生成会话密钥 双方各自用 Client Random + Server Random + Pre-Master Secret 计算出相同的会话密钥(Master Secret)
6. 加密通信 双方使用会话密钥开始加密 HTTP 请求和响应

2.3.2 TLS 1.2 vs TLS 1.3

对比维度 TLS 1.2 TLS 1.3
握手次数 2 次 RTT(往返) 1 次 RTT
速度 较慢 更快
加密套件 支持多种(含不安全的算法) 只支持安全的算法(移除了 RC4、3DES、SHA-1 等)
前向保密 可选(部分加密套件不支持) 强制(所有密钥交换都支持前向保密)
推荐程度 仍可用(兼容性好) 生产环境推荐

TLS 1.3 的改进:减少了 1 次 RTT,握手更快。同时移除了有安全漏洞的旧算法,强制支持前向保密(即使私钥泄露,历史通信内容仍无法被解密)。

2.4 证书链(Certificate Chain)

2.4.1 证书链的三层结构

根 CA 证书、中间 CA 证书、服务器证书的信任链

证书类型 说明 由谁签发 存放位置
根 CA 证书(Root CA) 信任锚点,是整个信任链的起点 自签名 浏览器/操作系统内置(预置信任)
中间 CA 证书(Intermediate CA) 根 CA 授权给中间 CA,用于签发服务器证书 根 CA 签发 随服务器证书一起下发
服务器证书(Server Certificate) 最终签发给网站的证书,包含域名和公钥 中间 CA 签发 Web 服务器上配置

2.4.2 jd.com 三层证书链

GlobalSign 根证书、GlobalSign RSA OV SSL CA 2018 中间证书、*.jd.com 服务器证书

*.jd.com 证书的使用者、签发者和有效期

浏览器证书查看器中的三层证书层次结构

三层对应关系:

层次 证书名称 类型 说明
第 1 层(根) GlobalSign 根 CA 证书 全球信任的根证书,浏览器/操作系统内置
第 2 层(中间) GlobalSign RSA OV SSL CA 2018 中间 CA 证书 由根 CA 签发,专门用于签发服务器证书
第 3 层(叶子) *.jd.com 服务器证书 由中间 CA 签发,包含京东的域名和公钥,通配符 *.jd.com 匹配所有子域名

关键点:

知识点 在这个例子中的体现
证书链验证 浏览器从 *.jd.com → 找到签发者 GlobalSign RSA OV SSL CA 2018 → 再找到签发者 GlobalSign → 根证书在信任列表中 → ✅ 信任链建立
通配符证书 *.jd.com 可以匹配 www.jd.com、item.jd.com、order.jd.com 等所有子域名,无需为每个子域名单独购买证书
中间 CA 的作用 根 CA 不直接签发服务器证书,而是签发中间 CA,由中间 CA 来签发。这样根 CA 的私钥可以离线保存,更安全

2.4.3 证书链验证流程

  1. 浏览器收到服务器发送的服务器证书。
  2. 检查证书的 Issuer(签发者)字段 → 找到签发该证书的“中间 CA 证书”。
  3. 检查中间 CA 证书的 Issuer → 找到“根 CA 证书”。
  4. 根 CA 证书是否在浏览器内置的“可信根 CA 列表”中?是 → 信任链建立,继续下一步;否 → 报错 NET::ERR_CERT_AUTHORITY_INVALID。

2.4.3 常见证书错误

错误码 含义 解决方案
NET::ERR_CERT_AUTHORITY_INVALID 证书链不完整或签发者不被信任 检查服务器是否配置了完整证书链(服务器证书 + 中间 CA 证书)
NET::ERR_CERT_COMMON_NAME_INVALID 证书域名与访问域名不匹配 重新签发证书,CN 或 SAN 字段要包含正确的域名
NET::ERR_CERT_DATE_INVALID 证书已过期 续签证书或检查系统时间
NET::ERR_CERT_REVOKED 证书已被吊销 联系 CA 重新签发证书

2.4.3 根证书信任列表

  1. 按 Win + R,输入 certmgr.msc,点击“确定”。
  2. 展开“受信任的根证书颁发机构”→“证书”。

Windows certmgr.msc 中的受信任根证书列表

评论