外观
浏览器证书
约 672 字大约 2 分钟
2025-06-19
整理常见证书类型,并提供本地自签证书的完整创建流程。
证书类型
| 类型 | 作用 | 适用场景 |
|---|---|---|
| SSL/TLS 证书 | 加密浏览器与服务器之间的通信,防窃听和篡改 | 所有 HTTPS 网站 |
| 域名验证 (DV) | 仅验证域名所有权 | 个人网站、博客 |
| 组织验证 (OV) | 验证域名和组织真实性 | 企业网站 |
| 扩展验证 (EV) | 最高级别验证,绿色地址栏 | 金融机构等高信任度场景 |
| 代码签名证书 | 验证软件发布者身份,确保代码未被篡改 | 浏览器扩展、插件 |
| 客户端证书 | 验证用户身份 | 企业内网、高安全性站点 |
| 电子邮件证书 | 加密和签名电子邮件 | 邮件安全通信 |
| 根证书 | 信任链起点,内置于浏览器和操作系统 | 验证其他证书合法性 |
| 中间证书 | 连接根证书和终端证书 | 建立完整信任链 |
| 自签名证书 | 用户自行生成和签名 | 测试或内部环境,浏览器会提示不受信任 |
| 通配符证书 | 保护同一主域名下的多个子域名 | 多子域名站点 |
| 多域名 (SAN) | 保护多个不同域名 | 拥有多个域名的企业 |
创建本地自签证书
步骤 1:创建根证书(CA)
# Linux / macOS
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-subj "/C=CN/ST=BJ/L=BJ/O=TecDev" \
-keyout CA.key -out CA.crt注意:Windows Git Bash 中转义符使用
\,Linux/macOS 使用/。
步骤 2:创建私钥
openssl genrsa -out private.key 2048步骤 3:创建证书签名请求(CSR)
# IP 方式
openssl req -new -key private.key \
-subj "/C=CN/ST=BJ/L=BJ/O=TecDev/CN=192.168.1.1" \
-sha256 -out private.csr
# 域名方式
openssl req -new -key private.key \
-subj "/C=CN/ST=BJ/L=BJ/O=TecDev/CN=www.example.com" \
-sha256 -out private.csr步骤 4:创建扩展配置文件
Chrome 等现代浏览器要求证书包含 SAN 扩展,否则无法授信。
创建 private.ext 文件:
[req]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = v3_req
[req_distinguished_name]
countryName = CN
stateOrProvinceName = Guangdong
localityName = Guangzhou
organizationName = TecDev
[v3_req]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.1
# DNS.1 = www.example.com # 域名方式请取消注释说明:
countryName:国家代码stateOrProvinceName:省份localityName:城市organizationName:组织/公司名称subjectAltName:必须与 CSR 中的 CN 一致,IP 方式使用IP.x,域名方式使用DNS.x
步骤 5:生成最终证书
openssl x509 -req -days 365 -in private.csr \
-CA CA.crt -CAkey CA.key -CAcreateserial \
-sha256 -out private.crt \
-extfile private.ext -extensions v3_req步骤 6:安装证书
- 双击
CA.crt安装到系统信任库 - Nginx 配置中使用
private.crt和private.key
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /path/to/private.crt;
ssl_certificate_key /path/to/private.key;
}