小结: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运行流程(简化)
- 密钥生成:用户生成一对公钥和私钥。
- 证书申请:用户将公钥及其身份信息发送给RA/CA。
- 身份验证:RA验证身份,并将信息转发给CA。
- 证书签发:CA签发包含用户信息和公钥的数字证书。
- 证书使用:用户将证书用于加密通信或签名验证。
- 证书验证:接收方通过CA的根证书验证证书合法性,并可用OCSP/CRL查询是否吊销。
- 证书吊销:证书若被盗或不再使用,可通过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 等) ---> 数字指纹(摘要)
数字指纹 + 私钥加密 -----------> 数字签名
所以可以理解为:
数字签名 = 私钥加密的数字指纹
🧪 三、比喻帮助理解
- 数字指纹 = 身份证号码:代表内容本身,但不能证明是谁发的。
- 数字签名 = 手写签名 + 身份证复印件:不仅能说明内容没改,还能说明是谁发的。
✅ 四、举例说明(实际通信流程)
以发送消息为例:
- 甲方准备明文
- 对明文做哈希 → 得到数字指纹
- 用私钥对指纹加密 → 得到数字签名
- 把原文 + 签名一起发给乙方
乙方收到后:
- 对原文再做一次哈希 → 得到本地数字指纹
- 用甲方公钥解密签名 → 得到甲方生成的数字指纹
- 比较两者是否一致
数字指纹是用来快速校验内容完整性的,而数字签名是在此基础上加上身份认证的一种机制。
网络通信中常见的加密算法分类:
在网络通信中主要用于数据包转发、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 地址(因为需要建立连接)
https://example.com/api/user?id=123
实际流程是:
- 浏览器用 TLS 建立加密通道(握手,协商密钥)
- 然后 HTTP 请求被加密成 TLS 包发送
- 网络中传输的是加密数据(肉眼或抓包工具如 Wireshark 看到的是乱码)
- 浏览器收到服务器响应后,用协商好的密钥解密数据
- 浏览器开发工具展示的是“解密后”的内容(看起来是明文)
🧩 其他说明:
- 商业交换机(如 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 中配置证书
🔧 配置示例:
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
<VirtualHost *:443>ServerName www.example.comSSLEngine onSSLCertificateFile /etc/httpd/ssl/server.crtSSLCertificateKeyFile /etc/httpd/ssl/private.keySSLCertificateChainFile /etc/httpd/ssl/chain.pem
</VirtualHost>
3. Java/Spring Boot 配置证书(使用 .p12
)
🧩 准备:
使用 OpenSSL 将 .crt
+ .key
转成 .p12
格式:
openssl pkcs12 -export \-in server.crt \-inkey private.key \-certfile chain.pem \-out server.p12
🔧 application.yml 配置示例:
server:port: 443ssl:key-store: classpath:server.p12key-store-password: changeitkey-store-type: PKCS12
4. Node.js(HTTPS 模块)配置证书
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 启用客户端证书验证:
ssl_verify_client on;
ssl_client_certificate /etc/nginx/ssl/ca.pem; # 客户端证书要由这个 CA 签发
🧪 测试和验证工具
-
✅ 本地验证证书链完整性:
openssl verify -CAfile fullchain.pem server.crt
-
✅ 在线验证证书部署是否正确:
- SSL Labs
- SSL Checker
证书文件结构说明
文件名 | 内容说明 |
---|---|
server.crt | 你的服务器证书(含公钥) |
private.key | 你的服务器私钥(务必保密) |
chain.pem | 中间证书链 |
fullchain.pem | 服务器证书 + 中间证书拼接 |
.p12 /.jks | Java/Spring 使用的密钥库 |