使用openssl命令,基于cert.cnf配置文件生成自签名SSL证书
生成自签证书顺序:0.证书配置文件 1.生成 RSA 私钥 2.创建证书签名请求(CSR) 3 .生成自签名证书(有效期 1 年)4. 验证证书
- 创建cert.cnf证书配置
[req]
default_bits = 2048 # RSA密钥长度(推荐2048或更高)
prompt = no # 禁用交互式提问
default_md = sha256 # 签名使用的哈希算法
distinguished_name = dn # 证书主题信息配置段
req_extensions = req_ext # 证书请求扩展配置段
x509_extensions = v3_req # 证书扩展配置段(自签名证书或中间CA使用)
[dn]
C = CN
ST = Beijing
L = Beijing
O = XX
OU = IT
CN = www.baidu.com # CN 设置自签域名/IP地址 CN = 192.168.1.101
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
basicConstraints = CA:FALSE
[alt_names]
DNS.1 = www.test1.cn # 第一个选项必须包含 CN 的值,可以域名/IP
DNS.2 = www.test2.cn
IP.1 = 192.168.1.101
IP.2 = 192.168.1.102
1. 生成RSA私钥
# 生成2048位RSA私钥(不加密)
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
# 生成带密码保护的私钥(推荐生产环境)
openssl genpkey -algorithm RSA -aes256 -out server.key -pkeyopt rsa_keygen_bits:2048
- 注意:如果使用加密私钥,后续命令需要输入密码
2. 创建证书签名请求(CSR)
# 使用配置文件创建CSR
openssl req -new -key server.key -out server.csr -config cert.cnf
- 确保
cert.cnf中的prompt = no,否则会提示交互式输入 - 验证CSR内容:
openssl req -noout -text -in server.csr
3. 生成自签名证书(有效期1年)
# 基于配置文件中的[v3_req]扩展生成证书
openssl x509 -req -in server.csr -signkey server.key -out server.crt \
-days 365 -extensions v3_req -extfile cert.cnf
-
重要参数:
-
-days 365:证书有效期(公共证书建议≤398天) -
-extensions v3_req:使用配置文件中的[v3_req]扩展 -
-extfile cert.cnf:指定扩展配置文件
-
4. 验证证书
# 查看证书信息
openssl x509 -noout -text -in server.crt
# 检查证书有效期
openssl x509 -noout -dates -in server.crt
5. 导出.pem证书
要将
.crt证书导出为 PEM 格式,实际上大多数情况下.crt文件本身就是 PEM 格式,但可以通过 OpenSSL 命令显式转换以确保格式正确。以下是具体操作步骤:
1. 检查 .crt 文件格式
PEM 格式的证书以文本形式存储,内容类似:
-----BEGIN CERTIFICATE-----
MIIDHzCCAgegAwIBAgIJAKr...(Base64编码数据)...
-----END CERTIFICATE-----
如果你的 .crt 文件是这种格式,它已经是 PEM 格式,可以直接使用。
2. 转换为 PEM 格式(无论原格式如何)
情况1:仅转换证书(不含私钥)
openssl x509 -in server.crt -out certificate.pem -outform PEM
-
-in:输入证书文件 -
-out:输出 PEM 文件 -
-outform PEM:指定输出格式为 PEM
情况2:导出证书链(包含中间证书)
如果.crt文件包含多个证书(服务器证书 + 中间证书),使用:
openssl crl2pkcs7 -nocrl -certfile server.crt | \
openssl pkcs7 -print_certs -out certificate-chain.pem
情况3:合并证书和私钥(创建完整的 PEM 配置)
如果需要同时包含证书和私钥(例如用于 Nginx):
# 先转换证书
openssl x509 -in server.crt -out cert.pem -outform PEM
# 再转换私钥(如果私钥不是 PEM 格式)
openssl rsa -in server.key -out key.pem -outform PEM
# 合并证书和私钥(顺序:证书在前,私钥在后)
cat cert.pem key.pem > certificate.pem
- 验证 PEM 文件
# 查看证书信息
openssl x509 -noout -text -in certificate.pem
# 确认格式为 PEM(应显示 "BEGIN CERTIFICATE")
head -n 5 certificate.pem
总结
-
.crt 通常已是 PEM 格式,直接重命名为
.pem即可使用 - 使用 OpenSSL 转换可确保格式兼容,尤其在跨平台时
- 证书链处理:确保中间证书按正确顺序包含在 PEM 文件中
如果你的 .crt 文件是 DER 二进制格式(非文本),则需要添加 -inform DER 参数进行转换:
openssl x509 -inform DER -in certificate.crt -out certificate.pem -outform PEM
以下是添加了详细注释的完整 cert.cnf 配置文件示例:
[req]
default_bits = 2048 # RSA密钥长度(推荐2048或更高)
default_keyfile = server.key # 生成的私钥文件名
distinguished_name = req_distinguished_name # 证书主题信息配置段
req_extensions = req_ext # 证书请求扩展配置段
x509_extensions = v3_req # 证书扩展配置段(自签名证书或中间CA使用)
string_mask = utf8only # 强制使用UTF-8编码
prompt = no # 禁用交互式提问,使用配置文件中的预设值
encrypt_key = no # 是否加密私钥(yes: 生成带密码保护的私钥)
default_md = sha256 # 签名使用的哈希算法
req_attribute = req_attributes # 证书请求属性配置段(可选)
dirstring_type = nobmp # 禁止使用BMP字符(避免某些编码问题)
[req_distinguished_name]
# 证书主题信息(Distinguished Name)
countryName = CN # 国家代码(2字母)
stateOrProvinceName = Beijing # 省份/州
localityName = Beijing # 城市/地区
0.organizationName = Example Company # 组织名称(数字前缀确保唯一性)
organizationalUnitName = IT Department # 部门名称
commonName = example.com # 通用名(通常为主域名)
emailAddress = admin@example.com # 邮箱地址
# 可选字段示例(如需添加)
# 0.localityName = City # 附加城市字段
# 1.organizationName = Company Inc. # 附加组织字段
[req_attributes]
# 证书请求属性(可选)
challengePassword = 1234 # 证书颁发机构的挑战密码
unstructuredName = Example Inc. # 非结构化名称
[req_ext]
# 证书请求扩展
subjectAltName = @alt_names # 主题备用名称(SAN),支持多个域名/IP
basicConstraints = CA:FALSE # 是否为CA证书(FALSE: 服务器/客户端证书)
keyUsage = digitalSignature, keyEncipherment # 密钥用途
extendedKeyUsage = serverAuth, clientAuth # 扩展密钥用途(同时支持服务器和客户端认证)
certificatePolicies = 1.3.6.1.4.1.57264.1.1 # 证书策略OID(可选)
[v3_req]
# 证书扩展(继承req_ext并添加额外扩展)
subjectAltName = @alt_names
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
authorityKeyIdentifier = keyid,issuer # 颁发者密钥标识符
subjectKeyIdentifier = hash # 主题密钥标识符
nsComment = "OpenSSL Generated Certificate" # Netscape注释
crlDistributionPoints = URI:http://crl.example.com/crl.pem # CRL分发点(可选)
authorityInfoAccess = OCSP;URI:http://ocsp.example.com # OCSP响应服务器(可选)
[alt_names]
# 主题备用名称列表(SAN)
# 支持域名(DNS.x)和IP地址(IP.x)
DNS.1 = example.com # 主域名
DNS.2 = www.example.com # www前缀域名
DNS.3 = api.example.com # API子域名
IP.1 = 192.168.1.1 # IP地址1
IP.2 = 10.0.0.1 # IP地址2
关键选项详细说明
-
密钥与签名选项:
-
default_bits: RSA密钥长度,影响安全性(推荐2048+) -
default_md: 签名哈希算法(如sha256、sha512) -
encrypt_key: 是否加密私钥(生产环境建议启用)
-
-
主题信息选项:
-
commonName: 通常是服务器域名(SAN存在时重要性降低) - 数字前缀(如
0.organizationName):确保字段唯一性
-
-
扩展选项:
-
subjectAltName: 现代浏览器强制要求,包含所有域名/IP -
keyUsage: 定义证书用途(如签名、加密) -
extendedKeyUsage: 细化用途(服务器认证、客户端认证) -
basicConstraints: 标识证书类型(CA/非CA) -
pathlen: CA证书专用,限制下级CA层级
-
-
合规性选项:
-
crlDistributionPoints: 证书撤销列表URL -
authorityInfoAccess: OCSP在线状态检查URL -
default_days: 证书有效期(建议不超过398天)
-
不同场景的配置差异
服务器证书
[req_ext]
extendedKeyUsage = serverAuth # 仅用于服务器认证
客户端证书
[req_distinguished_name]
commonName = User ID # 使用用户标识而非域名
[req_ext]
extendedKeyUsage = clientAuth # 仅用于客户端认证
中间CA证书
[v3_req]
basicConstraints = CA:TRUE,pathlen:1 # 允许签发下级证书,但限制层级
keyUsage = cRLSign, keyCertSign # CA专用密钥用法
这个配置文件覆盖了大多数常见场景,可以根据实际需求调整选项值和注释内容。