CA 证书详解:从原理到实践的完整教程 / 第 3 章:证书类型
第 3 章:证书类型
不同业务场景需要不同类型的证书。本章系统梳理各类 SSL/TLS 证书的区别、适用场景和选择策略。
3.1 按验证级别分类
DV / OV / EV 对比
| 特性 | DV(Domain Validation) | OV(Organization Validation) | EV(Extended Validation) |
|---|---|---|---|
| 验证内容 | 仅验证域名所有权 | 验证域名 + 组织真实性 | 严格验证组织法律实体 |
| 签发时间 | 数分钟 | 1-3 个工作日 | 3-7 个工作日 |
| 浏览器显示 | 🔒 锁图标 | 🔒 锁图标 | 🔒 锁图标(早期有绿色栏) |
| 证书中可见 | 域名 | 域名 + 组织名称 | 域名 + 组织详细信息 |
| 成本 | 免费 ~ 低价 | 中等 | 较高 |
| 适用场景 | 个人站点、API | 企业官网、SaaS | 金融、电商、政务 |
| 信任级别 | 基础 | 中等 | 最高 |
DV 证书
DV 证书只验证申请者是否拥有该域名,验证方式包括:
| 验证方式 | 说明 | 示例 |
|---|---|---|
| HTTP-01 | 在域名下放置特定文件 | http://example.com/.well-known/acme-challenge/xxx |
| DNS-01 | 添加 TXT 记录 | _acme-challenge.example.com TXT "xxx" |
| 向管理员邮箱发送验证邮件 | admin@example.com |
# DNS-01 验证示例:查看域名的 ACME DNS 记录
dig _acme-challenge.example.com TXT
OV 证书
OV 证书除了域名验证,还需要验证申请组织的真实性:
OV 验证流程:
1. 域名所有权验证(同 DV)
2. 组织信息验证
├── 营业执照 / 公司注册信息
├── 组织电话验证(拨打公开电话)
└── 地址验证
3. 签发证书
# 查看 OV 证书中的组织信息
echo | openssl s_client -connect github.com:443 2>/dev/null \
| openssl x509 -noout -subject -issuer
# subject=CN=github.com
# issuer=C=US, O=DigiCert Inc, CN=DigiCert TLS Hybrid ECC SHA384 2020 CA1
EV 证书
EV 证书有最严格的验证流程,包含:
- 组织法律实体存在性验证
- 授权代表验证
- 组织独占性域名使用权验证
- 物理地址验证
# 查看 EV 证书的扩展信息
echo | openssl s_client -connect www.apple.com:443 2>/dev/null \
| openssl x509 -noout -text | grep -A2 "Certificate Policies"
# EV 证书通常包含 CA/Browser Forum 的 EV 策略 OID
# 2.23.140.1.1 (EV Guidelines)
💡 提示:由于 EV 证书在浏览器 UI 上不再有明显的视觉区分(Chrome 77+ 移除了绿色地址栏),其相对 DV/OV 的额外价值正在减少。许多企业转向 OV 证书作为平衡选择。
3.2 按域名覆盖范围分类
单域名证书
只保护一个域名:
证书 CN: www.example.com
保护范围: www.example.com(仅此一个)
通配符证书(Wildcard Certificate)
保护一个域名及其所有一级子域名:
证书 CN: *.example.com
保护范围:
✅ www.example.com
✅ api.example.com
✅ mail.example.com
❌ sub.www.example.com (只匹配一级子域)
❌ example.com (不匹配根域名)
⚠️ 注意:通配符证书只匹配一级子域名。
*.example.com不保护a.b.example.com。
# 查看通配符证书的 SAN
echo | openssl s_client -connect "*.example.com:443" 2>/dev/null \
| openssl x509 -noout -text | grep -A5 "Subject Alternative Name"
多域名证书 / SAN 证书
SAN(Subject Alternative Name)证书可以在一张证书中包含多个完全不同的域名:
证书 SAN:
DNS: www.example.com
DNS: example.com
DNS: api.example.org
DNS: mail.test.net
DNS: *.staging.example.com
IP: 192.168.1.100
# 查看证书的 SAN 信息
echo | openssl s_client -connect www.google.com:443 -servername www.google.com 2>/dev/null \
| openssl x509 -noout -text | grep -A20 "Subject Alternative Name"
# 输出示例(Google 的证书包含大量域名):
# X509v3 Subject Alternative Name:
# DNS:*.google.com, DNS:*.android.com, DNS:*.appengine.google.com,
# DNS:*.cloud.google.com, DNS:google.com, ...
通配符 vs SAN 对比
| 特性 | 通配符证书 | SAN 证书 |
|---|---|---|
| 覆盖范围 | 同域名下所有一级子域 | 可包含任意域名 |
| 子域名管理 | 自动覆盖新增子域 | 新增域名需重新签发 |
| 价格 | 中等 | 按域名数量计费 |
| 安全性 | 私钥泄露影响所有子域 | 单点故障范围明确 |
| 适用场景 | 子域名较多且同一管理 | 固定数量的不同域名 |
3.3 按用途分类
TLS Web Server 证书
最常见的类型,用于 HTTPS 服务器身份验证:
# 检查证书的 Key Usage
echo | openssl s_client -connect www.baidu.com:443 2>/dev/null \
| openssl x509 -noout -text | grep -A2 "Extended Key Usage"
# 输出:
# X509v3 Extended Key Usage:
# TLS Web Server Authentication, TLS Web Client Authentication
代码签名证书(Code Signing Certificate)
用于签署软件代码,证明软件来源和完整性:
# 查看已签名的可执行文件(Windows Authenticode)
# Linux 上使用 osslsigncode 工具
osslsigncode verify /path/to/signed-binary.exe
客户端证书(Client Certificate)
用于客户端身份认证(双向 TLS,mTLS):
# Nginx 配置 mTLS
# ssl_client_certificate /etc/nginx/ssl/client-ca.crt;
# ssl_verify_client on;
# 生成客户端证书
openssl req -new -x509 -days 365 \
-key client.key -out client.crt \
-subj "/CN=client@example.com"
# 使用客户端证书访问
curl --cert client.crt --key client.key https://example.com
S/MIME 证书
用于电子邮件加密和签名:
# 查看 S/MIME 证书信息
openssl pkcs12 -in smime.p12 -info -nokeys
各类型证书 Key Usage 对照
| 证书类型 | Key Usage | Extended Key Usage |
|---|---|---|
| Web Server | digitalSignature, keyEncipherment | TLS Web Server Authentication |
| Client | digitalSignature | TLS Web Client Authentication |
| Code Signing | digitalSignature | Code Signing |
| S/MIME | digitalSignature, keyEncipherment, dataEncipherment | Email Protection |
3.4 自签名证书(Self-Signed Certificate)
自签名证书是用自己的私钥对自己签发的证书,没有经过 CA 的第三方认证。
生成自签名证书
# 方法 1:单条命令(RSA)
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout selfsigned.key -out selfsigned.crt \
-days 365 \
-subj "/C=CN/ST=Beijing/O=MyOrg/CN=localhost"
# 方法 2:使用 ECDSA(更快、更小)
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
-keyout selfsigned-ec.key -out selfsigned-ec.crt \
-days 365 \
-subj "/C=CN/ST=Beijing/O=MyOrg/CN=localhost"
# 查看生成的证书
openssl x509 -in selfsigned.crt -noout -text | head -15
包含 SAN 的自签名证书
# 创建配置文件
cat > san.cnf << 'EOF'
[req]
distinguished_name = req_dn
x509_extensions = v3_ext
prompt = no
[req_dn]
C = CN
ST = Beijing
O = MyOrg
CN = myapp.local
[v3_ext]
subjectAltName = @alt_names
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
[alt_names]
DNS.1 = myapp.local
DNS.2 = *.myapp.local
DNS.3 = localhost
IP.1 = 127.0.0.1
IP.2 = ::1
EOF
# 生成证书
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout myapp.key -out myapp.crt \
-days 365 -config san.cnf
# 验证 SAN
openssl x509 -in myapp.crt -noout -text | grep -A5 "Subject Alternative Name"
自签名证书的使用场景与风险
| 场景 | 推荐程度 | 说明 |
|---|---|---|
| 本地开发环境 | ✅ 推荐 | 零成本,快速启用 HTTPS |
| 内部测试环境 | ✅ 推荐 | 不需要外部信任 |
| 内网服务(有私有 CA) | ⚠️ 应使用私有 CA | 自签名无法集中管理 |
| 生产环境面向用户 | ❌ 不推荐 | 浏览器会警告,用户不信任 |
| 微服务间通信 | ⚠️ 视情况 | 可使用 Service Mesh 的 mTLS |
# 浏览器对自签名证书的处理
curl -k https://selfsigned.example.com # -k 忽略证书验证
# 或者将自签名证书添加到信任存储
# ⚠️ 生产环境切勿使用 -k 参数,它会绕过所有证书验证
3.5 证书格式转换
证书有多种存储格式,在不同场景中需要转换。
常见格式
| 格式 | 扩展名 | 说明 |
|---|---|---|
| PEM | .pem, .crt, .cer | Base64 编码,-----BEGIN CERTIFICATE----- |
| DER | .der, .cer | 二进制格式 |
| PKCS#12 | .p12, .pfx | 包含证书 + 私钥,可加密保护 |
| PKCS#7 | .p7b, .p7c | 证书链格式,不含私钥 |
转换命令
# PEM → DER
openssl x509 -in cert.pem -outform DER -out cert.der
# DER → PEM
openssl x509 -in cert.der -inform DER -outform PEM -out cert.pem
# PEM + Key → PKCS#12
openssl pkcs12 -export \
-in cert.pem -inkey key.pem \
-out cert.p12 \
-name "my-cert" \
-passout pass:mypassword
# PKCS#12 → PEM(提取证书和私钥)
openssl pkcs12 -in cert.p12 -out cert_extracted.pem -nodes -passin pass:mypassword
# 从 PKCS#12 中只提取证书
openssl pkcs12 -in cert.p12 -clcerts -nokeys -out cert_only.pem -passin pass:mypassword
# 从 PKCS#12 中只提取私钥
openssl pkcs12 -in cert.p12 -nocerts -out key_only.pem -passin pass:mypassword
# PEM → PKCS#7(证书链)
openssl crl2pkcs7 -nocrl -certfile leaf.pem -certfile intermediate.pem -out chain.p7b
# PKCS#7 → PEM
openssl pkcs7 -in chain.p7b -print_certs -out chain.pem
格式选择指南
| 场景 | 推荐格式 | 原因 |
|---|---|---|
| Nginx/Apache | PEM | 原生支持,配置简单 |
| Java Keystore | PKCS#12 → JKS | Java 生态标准 |
| Windows IIS | PKCS#12 (.pfx) | Windows 原生支持 |
| 代码签名 | PKCS#12 | 包含私钥,便于签名操作 |
| 证书链传输 | PKCS#7 | 可包含多张证书 |
3.6 证书密钥算法选择
RSA vs ECDSA vs Ed25519
| 特性 | RSA | ECDSA | Ed25519 |
|---|---|---|---|
| 密钥长度 | 2048-4096 bit | 256-384 bit | 256 bit |
| 签名速度 | 较慢 | 快 | 最快 |
| 验证速度 | 中等 | 快 | 快 |
| 证书大小 | 较大 | 较小 | 最小 |
| 兼容性 | 所有客户端 | 现代客户端 | 较新客户端 |
| 推荐场景 | 广泛兼容 | 现代 Web 服务 | 新项目/高性能 |
# RSA 密钥
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out rsa.key
# ECDSA 密钥(P-256)
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ecdsa.key
# Ed25519 密钥
openssl genpkey -algorithm Ed25519 -out ed25519.key
# 比较密钥大小
ls -la rsa.key ecdsa.key ed25519.key
# 查看密钥信息
openssl pkey -in ecdsa.key -text -noout | head -5
📋 业务场景:如果你的用户群体包含老旧设备(如 Android 4.x、Windows XP),选择 RSA 2048 以确保兼容性。对于现代 Web 服务,推荐 ECDSA P-256 以获得更好的性能。
3.7 证书选择决策树
需要证书?
│
├── 用于生产环境面向公众?
│ ├── 是 → 商业 CA(DV/OV 根据业务需求选择)
│ │ Let's Encrypt 适合免费 DV
│ └── 否 → 内网/开发?
│ ├── 有私有 CA → 使用私有 CA 签发
│ └── 无私有 CA → 自签名
│
├── 子域名数量多且动态变化?
│ └── 是 → 通配符证书
│
├── 需要保护多个不同域名?
│ └── 是 → SAN 证书
│
└── 密钥算法选择?
├── 需要最大兼容性 → RSA 2048+
├── 现代 Web 服务 → ECDSA P-256
└── 高性能/新项目 → Ed25519
3.8 本章小结
| 分类维度 | 类型 | 适用场景 |
|---|---|---|
| 验证级别 | DV | 个人站点、API、开发环境 |
| OV | 企业官网、SaaS | |
| EV | 金融、政务、电商 | |
| 域名范围 | 单域名 | 固定单一域名 |
| 通配符 | 大量子域名 | |
| SAN | 多个不同域名 | |
| 签发方式 | CA 签发 | 生产环境 |
| 自签名 | 开发测试 | |
| 密钥算法 | RSA | 最大兼容 |
| ECDSA | 性能优先 | |
| Ed25519 | 新项目 |
📚 扩展阅读
- CA/Browser Forum EV Guidelines
- Let’s Encrypt Rate Limits
- Mozilla Wiki - Certificate Verification
- SSL Labs - SSL/TLS Deployment Best Practices
上一章:第 2 章:工作原理 下一章:第 4 章:系统证书存储 — 了解各 Linux 发行版的证书存储机制和管理方式。