小结:PKI(Public Key Infrastructure,公钥基础设施)

PKI(Public Key Infrastructure,公钥基础设施)

是一套为网络通信提供安全性的体系结构,其核心目标是实现身份认证、数据加密、完整性校验和防抵赖等安全功能。下面是对PKI架构的系统性总结:


🔐 一、PKI架构的核心组成

组件 说明
CA(Certificate Authority)证书颁发机构 负责签发、撤销和管理数字证书,是PKI体系的信任核心。
RA(Registration Authority)注册机构 负责验证申请者的身份,辅助CA完成证书的签发。
证书持有者(Entity/Subscriber) 使用数字证书进行加密通信的用户、设备或服务器。
证书库(Certificate Repository) 存储并提供数字证书查询服务,如LDAP服务器或HTTP服务。
CRL(Certificate Revocation List)证书吊销列表 用于列出已被吊销但尚未过期的证书。
OCSP(Online Certificate Status Protocol)在线证书状态协议 一种实时查询证书状态的协议,替代传统CRL机制。
密钥对(Key Pair) 包括私钥(保密)和公钥(可公开),用于加密/解密和签名/验签。

🧭 二、PKI运行流程(简化)

  1. 密钥生成:用户生成一对公钥和私钥。
  2. 证书申请:用户将公钥及其身份信息发送给RA/CA。
  3. 身份验证:RA验证身份,并将信息转发给CA。
  4. 证书签发:CA签发包含用户信息和公钥的数字证书。
  5. 证书使用:用户将证书用于加密通信或签名验证。
  6. 证书验证:接收方通过CA的根证书验证证书合法性,并可用OCSP/CRL查询是否吊销。
  7. 证书吊销:证书若被盗或不再使用,可通过CRL或OCSP机制吊销。

🏛️ 三、PKI信任模型

模型类型 描述
单层CA 所有证书由一个CA颁发,结构简单但安全性较低。
层级CA(多级CA) 包括一个根CA和多个下级CA(中间CA),安全性高,常用于企业或国家级PKI体系。
网状模型 各CA之间互信(如PGP Web of Trust),灵活但管理复杂。

🛡️ 四、PKI的典型应用场景

  • HTTPS/SSL 加密通信
  • 数字签名(邮件、PDF、软件)
  • VPN 和 Wi-Fi 身份认证
  • 智能卡、门禁系统
  • 电子政务和司法系统
  • 企业内部身份与权限管理

⚠️ 五、PKI面临的挑战

  • 私钥保护(如硬件加密模块 HSM 的使用)
  • 证书吊销机制效率(CRL更新慢,OCSP可能被中间人攻击)
  • CA被攻破的信任危机(如 DigiNotar 事件)
  • 用户对证书验证的忽视(浏览器警告被忽略)

数字指纹(Message Digest)

数字签名(Digital Signature)

虽然经常一起使用,但它们是不同的概念,承担不同的作用。下面是它们的区别和联系的详细说明:


🧾 一、基本定义

项目 数字指纹(摘要) 数字签名
定义 对消息进行哈希运算得到的唯一"摘要值" 用发送者私钥对数字指纹加密后的加密结果
用途 检测消息是否被篡改(完整性校验) 验证消息的来源和是否被篡改(身份 + 完整性)
生成方式 使用**哈希算法(如 SHA-256)**处理消息内容 用私钥对摘要进行加密(如 RSA/ECC 签名)
是否加密 ❌ 不加密,只是摘要 ✅ 是用私钥加密后的摘要
是否可验证身份 ❌ 无法验证身份 ✅ 可验证签名者身份

🔐 二、关系与流程图

数字签名的过程 必须先生成数字指纹,然后对其签名:

复制代码
原文 ---> 哈希算法(SHA-256 等) ---> 数字指纹(摘要)
数字指纹 + 私钥加密 -----------> 数字签名

所以可以理解为:

数字签名 = 私钥加密的数字指纹


🧪 三、比喻帮助理解

  • 数字指纹 = 身份证号码:代表内容本身,但不能证明是谁发的。
  • 数字签名 = 手写签名 + 身份证复印件:不仅能说明内容没改,还能说明是谁发的。

✅ 四、举例说明(实际通信流程)

以发送消息为例:

  1. 甲方准备明文
  2. 对明文做哈希 → 得到数字指纹
  3. 用私钥对指纹加密 → 得到数字签名
  4. 把原文 + 签名一起发给乙方

乙方收到后:

  1. 对原文再做一次哈希 → 得到本地数字指纹
  2. 用甲方公钥解密签名 → 得到甲方生成的数字指纹
  3. 比较两者是否一致

数字指纹是用来快速校验内容完整性的,而数字签名是在此基础上加上身份认证的一种机制。

网络通信中常见的加密算法分类:

在网络通信中主要用于数据包转发、VLAN隔离、安全控制等功能 。虽然它本身不总是直接执行高级加密操作,但在启用了管理加密、安全接入或传输保护的场景中,会使用到多种加密算法。


🔐 一、用于管理加密的算法(如 SSH、HTTPS 登录)

📌 使用场景:通过 SSH 或 HTTPS 安全访问交换机的管理界面

类型 常见算法 说明
对称加密 AES、3DES 用于会话期间的数据加密
非对称加密 RSA、ECDSA 用于密钥交换、身份认证
哈希算法 SHA-1、SHA-2(SHA-256) 用于数据完整性校验(如数字签名)

📶 二、用于数据链路加密的算法(如 MACsec)

📌 使用场景:链路层加密(L2 层安全),例如企业级网络中启用 MACsec 加密

类型 常见算法 说明
对称加密 AES-GCM(128 或 256) 认证加密(Authenticated Encryption)
密钥协商协议 MKA(MACsec Key Agreement,基于 IEEE 802.1X) 配合 802.1AE 协议分发加密密钥

🌐 三、用于 VPN 的加密算法(如 IPsec over VLAN)

📌 使用场景:部分高端交换机具备 VPN 支持,或用于三层交换支持加密路由

类型 常见算法 说明
对称加密 AES、3DES、ChaCha20 用于加密传输数据
非对称加密 RSA、DH(Diffie-Hellman)、ECDH 用于密钥交换和身份认证
哈希算法 SHA-1、SHA-256、SHA-3 完整性校验
封装协议 ESP(Encapsulating Security Payload) IPsec 中的加密协议

👮 四、用于接入认证(如 802.1X)

📌 使用场景:终端接入时使用 EAP 协议进行身份验证,加密传输凭证

类型 常见算法 用途
非对称加密 RSA、ECDSA 用于服务器身份验证
对称加密/协商 TLS(含 AES) EAP-TLS 中保护认证过程
哈希算法 HMAC-SHA256 用于消息认证码(MAC)

🛡️ HTTPS 的加密机制(TLS 层)

HTTPS = HTTP + TLS,加密的是​整个 HTTP 请求报文​:

✔ 在加密的内容包括:

  • 请求路径(但不包括域名)
  • 请求参数(如 POST 的 body、GET 的 query)
  • Cookie、Header
  • 响应内容

❌ 不加密的内容:

  • 域名(SNI 会暴露)
  • IP 地址(因为需要建立连接)

http 复制代码
https://example.com/api/user?id=123

实际流程是:

  1. 浏览器用 TLS 建立加密通道(握手,协商密钥)
  2. 然后 HTTP 请求被加密成 TLS 包发送
  3. 网络中传输的是加密数据(肉眼或抓包工具如 Wireshark 看到的是乱码)
  4. 浏览器收到服务器响应后,用协商好的密钥解密数据
  5. 浏览器开发工具展示的是"解密后"的内容(看起来是明文)

🧩 其他说明:

  • 商业交换机(如 Cisco、Huawei、Juniper)通常支持配置密码加密(如 service password-encryption)或启用 SSHv2。
  • 有些交换机还支持 TPM(可信平台模块)或 FIPS 模式,要求加密算法符合安全标准。

✅ 总结表

加密用途 常用算法
管理安全(SSH/HTTPS) AES、RSA、SHA-2
数据链路加密(MACsec) AES-GCM、802.1AE、MKA
VPN加密(IPsec) AES、3DES、RSA、DH、SHA-2
接入认证(802.1X) TLS、EAP、HMAC-SHA、RSA

在实际项目或生产环境中,配置证书(尤其是 HTTPS 证书)主要涉及服务器安装证书、绑定端口、配置中间证书链等步骤。下面我分场景给你列出配置方法。


在 HTTPS 中,CA(Certificate Authority,​证书颁发机构 ​)签发的数字证书起到了身份认证 + 公钥可信传递的关键作用。下面我们来详细说明 CA 证书的作用、类型、使用场景等内容:


CA 证书的核心作用

作用 说明
身份认证 确保服务器/客户端确实是其声称的实体,防止中间人攻击
传递公钥的信任链 公钥以数字证书形式传递,浏览器通过 CA 签名验证其合法性
构建信任体系(PKI) PKI(公钥基础设施)体系的基础,确保证书可验证和撤销
数据加密起点 TLS 握手中用证书内的公钥加密会话密钥

使用场景举例

场景 所需证书类型
用户访问 HTTPS 网站 根证书(本地)+ 中间 + 服务器证书
企业内网系统双向认证 客户端证书 + 服务器证书
VPN、S/MIME 邮件加密、代码签名 客户端/签名证书 + 中间 CA
HTTPS 抓包工具(如 Charles) 本地自建根证书(作为中间人)
证书类型 用途 签发者 安装位置
根证书 信任起点 自签名 浏览器/系统
中间证书 代理签发 根证书 随网站传输
服务器证书 网站身份认证 中间证书 Web 服务器
客户端证书 用户身份认证 中间/根证书 浏览器/系统

Web 服务器配置证书方法

1. Nginx 中配置证书

🔧 配置示例:

nginx 复制代码
server {
    listen 443 ssl;
    server_name www.example.com;

    ssl_certificate     /etc/nginx/ssl/fullchain.pem;   # 服务器证书 + 中间证书链
    ssl_certificate_key /etc/nginx/ssl/private.key;     # 私钥文件

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://localhost:3000;
    }
}
  • fullchain.pem:包含服务器证书 + 中间 CA 链
  • private.key:仅服务器可见的私钥

2. Apache 配置 HTTPS

apache 复制代码
<VirtualHost *:443>
    ServerName www.example.com

    SSLEngine on
    SSLCertificateFile      /etc/httpd/ssl/server.crt
    SSLCertificateKeyFile   /etc/httpd/ssl/private.key
    SSLCertificateChainFile /etc/httpd/ssl/chain.pem
</VirtualHost>

3. Java/Spring Boot 配置证书(使用 .p12

🧩 准备:

使用 OpenSSL 将 .crt + .key 转成 .p12 格式:

bash 复制代码
openssl pkcs12 -export \
  -in server.crt \
  -inkey private.key \
  -certfile chain.pem \
  -out server.p12

🔧 application.yml 配置示例:

yaml 复制代码
server:
  port: 443
  ssl:
    key-store: classpath:server.p12
    key-store-password: changeit
    key-store-type: PKCS12

4. Node.js(HTTPS 模块)配置证书

js 复制代码
const https = require('https');
const fs = require('fs');

const options = {
  cert: fs.readFileSync('fullchain.pem'),
  key: fs.readFileSync('private.key')
};

https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end("Hello HTTPS!");
}).listen(443);

客户端证书验证配置(双向认证)

Nginx 启用客户端证书验证:

nginx 复制代码
ssl_verify_client on;
ssl_client_certificate /etc/nginx/ssl/ca.pem;  # 客户端证书要由这个 CA 签发

🧪 测试和验证工具

  • 本地验证证书链完整性

    bash 复制代码
    openssl verify -CAfile fullchain.pem server.crt
  • 在线验证证书部署是否正确


证书文件结构说明

文件名 内容说明
server.crt 你的服务器证书(含公钥)
private.key 你的服务器私钥(务必保密)
chain.pem 中间证书链
fullchain.pem 服务器证书 + 中间证书拼接
.p12/.jks Java/Spring 使用的密钥库
相关推荐
一只码代码的章鱼2 小时前
学习笔记(算法学习+Maven)
笔记·学习·算法
huangyuchi.3 小时前
【C++11】类的新功能
开发语言·笔记·c++11·delete·移动构造·移动赋值·deflut
灏瀚星空5 小时前
从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——线性代数与矩阵运算 | 矩阵基础
笔记·python·学习·线性代数·数学建模·金融·矩阵
名字不要太长 像我这样就好11 小时前
【iOS】OC源码阅读——alloc源码分析
笔记·学习·macos·ios·objective-c
xin007hoyo12 小时前
算法笔记.染色法判断二分图
数据结构·笔记·算法
大学生亨亨13 小时前
go语言八股文(五)
开发语言·笔记·golang
无敌小茶16 小时前
Linux学习笔记之动静态库
linux·笔记
DXM052116 小时前
牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记3-地图基本操作与实战案例
开发语言·笔记·学习·arcgis·c#·ae·arcgis engine
Humbunklung18 小时前
PySide6 GUI 学习笔记——常用类及控件使用方法(常用类矩阵QRectF)
笔记·python·学习·pyqt