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

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向管理员邮箱发送验证邮件[email protected]
# 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 "/[email protected]"

# 使用客户端证书访问
curl --cert client.crt --key client.key https://example.com

S/MIME 证书

用于电子邮件加密和签名:

# 查看 S/MIME 证书信息
openssl pkcs12 -in smime.p12 -info -nokeys

各类型证书 Key Usage 对照

证书类型Key UsageExtended Key Usage
Web ServerdigitalSignature, keyEnciphermentTLS Web Server Authentication
ClientdigitalSignatureTLS Web Client Authentication
Code SigningdigitalSignatureCode Signing
S/MIMEdigitalSignature, keyEncipherment, dataEnciphermentEmail 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, .cerBase64 编码,-----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/ApachePEM原生支持,配置简单
Java KeystorePKCS#12 → JKSJava 生态标准
Windows IISPKCS#12 (.pfx)Windows 原生支持
代码签名PKCS#12包含私钥,便于签名操作
证书链传输PKCS#7可包含多张证书

3.6 证书密钥算法选择

RSA vs ECDSA vs Ed25519

特性RSAECDSAEd25519
密钥长度2048-4096 bit256-384 bit256 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 发行版的证书存储机制和管理方式。