强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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"
Email 向管理员邮箱发送验证邮件 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 新项目

📚 扩展阅读


上一章第 2 章:工作原理 下一章第 4 章:系统证书存储 — 了解各 Linux 发行版的证书存储机制和管理方式。