使用 OpenSSL 生成自签名 SSL 证书详解

1,665 阅读4分钟

在日常运维或开发测试环境中,HTTPS 是基本保障,而 SSL/TLS 证书是其核心组成。本文将介绍使用 OpenSSL 工具生成自签名证书的完整流程,涵盖私钥、CSR、证书三者的作用,签名原理,以及脚本化生成证书的实践。


一、基础概念理解

1. 私钥(Private Key)

  • 是用于签名和解密的核心文件。
  • 保存在本地,必须严格保密。

2. 证书签名请求(CSR)

  • 是由私钥生成的包含公钥与身份信息的请求文件。
  • 通常提交给证书颁发机构(CA)进行签名。
  • 使用私钥进行签名,保证请求的合法性。

3. 证书(CRT)

  • 是包含了身份信息、公钥和数字签名的结构化文件。
  • 可以由自签生成,也可以由 CA 签发。

二、签名过程原理解析

签名的本质

签名过程就是:

  1. 用私钥对 CSR(或证书正文)做摘要并签名。
  2. 签名后的内容可以通过对应的公钥进行验证。

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 证书生成流程与注意事项

生成流程概览

  1. 生成私钥(Private Key):保护通信安全的核心秘钥。
  2. 基于私钥生成 CSR:描述域名与身份信息,包含公钥。
  3. 使用私钥签名 CSR,生成自签名证书(或提交 CA)。
  4. 可选:将证书与私钥合并为 PEM 格式,便于某些场景使用。
  5. 部署证书到服务如 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,请参考后续内容。