在日常运维或开发测试环境中,HTTPS 是基本保障,而 SSL/TLS 证书是其核心组成。本文将介绍使用 OpenSSL 工具生成自签名证书的完整流程,涵盖私钥、CSR、证书三者的作用,签名原理,以及脚本化生成证书的实践。
一、基础概念理解
1. 私钥(Private Key)
- 是用于签名和解密的核心文件。
- 保存在本地,必须严格保密。
2. 证书签名请求(CSR)
- 是由私钥生成的包含公钥与身份信息的请求文件。
- 通常提交给证书颁发机构(CA)进行签名。
- 使用私钥进行签名,保证请求的合法性。
3. 证书(CRT)
- 是包含了身份信息、公钥和数字签名的结构化文件。
- 可以由自签生成,也可以由 CA 签发。
二、签名过程原理解析
签名的本质
签名过程就是:
- 用私钥对 CSR(或证书正文)做摘要并签名。
- 签名后的内容可以通过对应的公钥进行验证。
CA 会:
- 校验 CSR 中的身份信息与域名控制权
- 使用其根私钥对 CSR 内容签名
- 颁发带有签名的证书,供客户端验证信任
为什么不能跳过 CSR 直接用私钥生成证书?
虽然可以通过自签形式合并生成,但 CSR 的核心作用有:
- 结构化地描述域名、组织、使用者等信息。
- 绑定公钥,供 CA 验证并签名。
- 保证证书生成过程中签名一致性与身份的合法性。
签名过程简要步骤
1. 生成私钥
openssl genrsa -out "$KEY_FILE" 2048
genrsa:生成 RSA 私钥-out:指定输出文件路径2048:私钥长度(位),推荐使用 2048 或以上
2. 生成证书签名请求(CSR)
openssl req -new -key "$KEY_FILE" -out "$CSR_FILE"
req:表示生成证书请求-new:新建一个请求文件-key:指定已有私钥路径-out:输出 CSR 文件路径
3. 使用私钥对 CSR 进行自签名,生成证书
openssl x509 -req -in "$CSR_FILE" -signkey "$KEY_FILE" -out "$CRT_FILE" -days 365
x509:创建 x509 格式证书-req:表示基于请求生成-signkey:用于签名的私钥-days:证书有效期
三、生成流程脚本实践
以下为完整自动化脚本:
#!/bin/bash
CERT_DIR="./ssl"
DOMAIN="example.com"
DAYS=365
KEY_FILE="$CERT_DIR/$DOMAIN.key"
CSR_FILE="$CERT_DIR/$DOMAIN.csr"
CRT_FILE="$CERT_DIR/$DOMAIN.crt"
PEM_FILE="$CERT_DIR/$DOMAIN.pem"
mkdir -p "$CERT_DIR"
echo "🔐 生成私钥..."
openssl genrsa -out "$KEY_FILE" 2048
echo "📄 生成 CSR..."
openssl req -new -key "$KEY_FILE" -out "$CSR_FILE" -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=IT/CN=$DOMAIN"
echo "✅ 生成自签名证书..."
openssl x509 -req -in "$CSR_FILE" -signkey "$KEY_FILE" -out "$CRT_FILE" -days "$DAYS"
echo "📦 合并 PEM(可选)..."
cat "$CRT_FILE" "$KEY_FILE" > "$PEM_FILE"
ls -l "$CERT_DIR"
执行后会生成以下文件:
example.com.key:私钥example.com.csr:证书签名请求example.com.crt:自签名证书example.com.pem:合并证书(有些服务如 HAProxy 需要)
四、部署证书(以 Nginx 为例)
ssl_certificate /etc/ssl/example.com.crt;
ssl_certificate_key /etc/ssl/example.com.key;
五、总结:SSL 证书生成流程与注意事项
生成流程概览
- 生成私钥(Private Key):保护通信安全的核心秘钥。
- 基于私钥生成 CSR:描述域名与身份信息,包含公钥。
- 使用私钥签名 CSR,生成自签名证书(或提交 CA)。
- 可选:将证书与私钥合并为 PEM 格式,便于某些场景使用。
- 部署证书到服务如 Nginx、HAProxy、Tomcat、Kubernetes 等。
注意事项
- 私钥应永久保密,避免泄露。
- 证书有效期默认一年,可按需设定。
.csr文件虽中间产物,但对申请 CA 证书必不可少。- 自签证书不会被浏览器信任,仅用于内网/测试。
- 若使用公网域名和正式服务,应申请受信任 CA 签名证书。
常见文件作用对照表
| 文件扩展名 | 文件内容说明 | 用途 |
|---|---|---|
.key | 私钥,配合公钥用于加解密与签名验证 | 服务器端持有,需严格保密 |
.csr | 证书签名请求,含公钥和主体信息 | 提交给 CA 申请证书 |
.crt / .pem | 证书文件,含公钥、签名等内容 | 部署到 Web 服务器供客户端验证身份 |
.pem | 可能是证书 + 私钥合并格式(取决于生成) | 某些应用(如 HAProxy)需合并使用形式 |
✅ 通常
.crt和.pem内容类似,.pem更通用,支持证书链合并。
补充一:查看 CSR 内容
生成 CSR 后可用如下命令查看内容:
openssl req -in server.csr -noout -text
示例输出:
Certificate Request:
Subject: C=CN, ST=Beijing, L=Beijing, O=MyCompany, CN=example.com
Public Key Algorithm: rsaEncryption
Signature Algorithm: sha256WithRSAEncryption
补充二:使用 CSR 向 CA 申请证书
有了 .csr 文件后,可提交至以下 CA 平台进行证书申请:
验证方式
- DNS 记录验证
- 文件验证
- 邮件验证
CA 验证通过后,会返回 .crt 或 .pem 证书文件。
如需生成包含多个域名的 SAN 扩展证书、自建 CA 批量签发证书、或部署 Kubernetes Secret,请参考后续内容。