用户想要了解一份完整的操作指南,而不是零散的片段。不过“大全”的范围其实很广,我需要聚焦在他明确提到的两个核心需求上:CSR生成和证书转换。其他相关操作可以作为补充,但不宜过度扩,OpenSSL 是处理 SSL 证书、密钥和 CSR 的瑞士军刀。这里是一份针对 生成 CSR 和 转换证书格式 的常用命令大全:
核心概念:
CSR (Certificate Signing Request): 包含您的公钥和标识信息(域名、公司等),提交给证书颁发机构 (CA) 以获取签名证书。
证书格式:
PEM (.pem, .crt, .cer, .key): 最常见的文本格式,基于 Base64 编码,有明确的 -----BEGIN ...----- 和 -----END ...----- 标记。可包含证书、私钥、CSR 等。(最常用)
DER (.der, .cer): 二进制格式。Windows 系统和 Java 环境常用。
PKCS#7 / P7B (.p7b, .p7c): 通常用于证书链(包含多个证书),不包含私钥。Windows 和 Java 常用。
PKCS#12 / PFX (.p12, .pfx): 二进制格式,包含证书、证书链和私钥,通常用密码保护。用于备份或传输完整的证书身份(如 IIS 导入导出)。
一、生成 CSR (Certificate Signing Request)
生成 CSR 通常涉及两个步骤:1. 生成私钥;2. 使用私钥创建 CSR。
方法 1:一步生成私钥和 CSR (最常见)
bash
openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr
req: 使用证书请求实用程序。
-new: 创建新的 CSR。
-newkey rsa:2048: 同时生成一个新的 RSA 私钥(2048 位强度)。(推荐 RSA 2048+ 或 ECC)
-nodes 或 -noenc: 生成未加密的私钥(无密码)。省略此项会要求设置私钥密码(服务器启动时需输入)。
-keyout yourdomain.key: 指定生成的私钥文件名。
-out yourdomain.csr: 指定生成的 CSR 文件名。
执行此命令后,会交互式询问您的组织信息(Country, State, Locality, Organization, Organizational Unit, Common Name, Email)。Common Name (CN) 必须是您要保护的主要域名 (FQDN),如 www.example.com 或 example.com。challenge password 和 optional company name 通常留空直接回车。
方法 2:使用现有私钥生成 CSR
如果您已经有一个私钥文件(existing.key):
bash
openssl req -new -key existing.key -out yourdomain.csr
-key existing.key: 指定要使用的现有私钥文件。
同样会交互式询问组织信息。
方法 3:使用配置文件 (req.conf) 非交互生成 CSR (推荐自动化)
创建配置文件 req.conf (示例):
conf
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no # 关闭交互提示
[req_distinguished_name]
countryName = US
stateOrProvinceName = California
localityName = San Francisco
organizationName = Your Company, Inc.
organizationalUnitName = IT Department
commonName = www.yourdomain.com
emailAddress = admin@yourdomain.com
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.yourdomain.com
DNS.2 = yourdomain.com
DNS.3 = mail.yourdomain.com
可以添加更多 DNS 或 IP 条目
IP.1 = 192.168.1.1
修改 [req_distinguished_name] 和 [alt_names] 部分为您自己的信息。
commonName 仍然重要,但现代证书更依赖 subjectAltName (SAN)。
prompt = no 是关键,避免交互提问。
运行命令:
bash
openssl req -new -key yourdomain.key -out yourdomain.csr -config req.conf
使用 -config req.conf 指定配置文件。
方法 4:生成 ECC (椭圆曲线) 私钥和 CSR (推荐,更高效安全)
bash
生成 ECC 私钥 (例如 secp384r1 曲线)
openssl ecparam -genkey -name secp384r1 -out ecc.key
# 使用 ECC 私钥生成 CSR
openssl req -new -key ecc.key -out ecc.csr
或者一步生成 (使用配置文件更佳):
openssl req -new -newkey ec:<(openssl ecparam -name secp384r1) -nodes -keyout ecc.key -out ecc.csr
将 secp384r1 替换为其他曲线如 prime256v1 (NIST P-256) 或 secp521r1 等。
验证 CSR 内容
查看 CSR 中的信息:
bash
openssl req -in yourdomain.csr -noout -text
检查 Subject (DN), Public Key Algorithm, Key Size, Extensions (特别是 SANs) 是否正确。
二、转换证书格式
1. PEM 和 DER 互转
PEM 转 DER:
bash
openssl x509 -in certificate.pem -outform DER -out certificate.der
DER 转 PEM:
bash
openssl x509 -inform DER -in certificate.der -out certificate.pem
2. PEM 和 PKCS#7 (P7B) 互转
PEM 转 P7B (通常用于包含链):
bash
openssl crl2pkcs7 -nocrl -certfile certificate.pem -certfile intermediate.pem -out certificate.p7b
-certfile 可以多次使用来包含终端证书和中间证书。-nocrl 表示不包含吊销列表。
P7B 转 PEM:
bash
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.pem
这会提取 P7B 文件中的所有证书并以 PEM 格式写入一个文件。
3. PEM 和 PKCS#12 (PFX/P12) 互转
PEM (证书 + 私钥 + 链) 转 PFX/P12:
bash
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt -certfile intermediate.crt
-inkey private.key: 您的私钥文件 (PEM 格式)。
-in certificate.crt: 您的终端证书文件 (PEM)。
-certfile intermediate.crt: 中间证书文件 (PEM)。可以多次使用添加多个中间证书。
执行命令后会提示设置导出密码,用于保护 .pfx/.p12 文件。务必牢记此密码!
PFX/P12 转 PEM (提取所有内容):
bash
openssl pkcs12 -in certificate.pfx -nodes -out allcerts.pem
-nodes: 输出未加密的私钥(方便服务器使用)。
输入命令后会提示输入 PFX/P12 文件的导入密码。
输出的 allcerts.pem 文件会依次包含:私钥、终端证书、中间证书(如果有)。您可能需要手动将它们拆分到不同的文件中。
从 PFX/P12 中提取私钥 (PEM):
bash
openssl pkcs12 -in certificate.pfx -nocerts -out private.key.pem
-nocerts: 只提取私钥。
会提示输入 PFX 密码,并设置输出私钥文件的密码(如果需要加密私钥,省略 -nodes)。
输出未加密私钥: 加上 -nodes:
bash
openssl pkcs12 -in certificate.pfx -nocerts -nodes -out private.key
从 PFX/P12 中提取证书 (PEM, 包含所有证书):
bash
openssl pkcs12 -in certificate.pfx -clcerts -nokeys -out certs.pem
-clcerts: 提取客户端证书(通常是终端证书)。
-nokeys: 不提取私钥。
要提取所有证书(终端+链),用:
bash
openssl pkcs12 -in certificate.pfx -nokeys -out allcerts.pem
4. 查看证书内容
查看 PEM 证书信息:
bash
openssl x509 -in certificate.pem -noout -text
查看 DER 证书信息:
bash
openssl x509 -inform DER -in certificate.der -noout -text
查看 CSR 信息 (已包含在上面):
bash
openssl req -in request.csr -noout -text
查看 PFX/P12 文件信息:
bash
openssl pkcs12 -info -in certificate.pfx
5. 合并/拆分 PEM 文件
合并证书链 (如配置 Apache/Nginx): 通常将终端证书放在最前面,后面跟着中间证书(按顺序,应用证书紧挨根证书的放最后)。
bash
cat your_domain_certificate.pem intermediate_certificate1.pem intermediate_certificate2.pem > fullchain.pem
拆分 PEM 文件: 手动编辑或用脚本根据 -----BEGIN... 和 -----END... 标记拆分。
重要提示
私钥安全: 私钥 (*.key) 是最高机密!生成后务必设置严格的权限 (e.g., chmod 400 yourdomain.key),并妥善保管。避免在未加密的通道传输。
备份: 在转换或操作前,备份原始文件。
密码: 为加密的私钥和 PFX/P12 文件设置强密码并安全存储。
算法和长度: 使用安全的密钥算法(RSA 2048+ 或 ECC)和散列算法(SHA-256 或更高)。OpenSSL 3.x 默认更安全。
Subject Alternative Names (SANs): 现代浏览器要求多域名/子域名的证书必须使用 SAN 扩展。生成 CSR 时务必正确配置 SANs (使用配置文件 req.conf 是最佳实践)。
版本: 命令语法在不同 OpenSSL 版本间可能略有差异。使用 openssl version 查看版本。本指南主要基于 OpenSSL 1.1.1 和 3.x。
文件扩展名: .pem, .crt, .cer 常表示 PEM 格式,.der 表示 DER 格式,.p12, .pfx 表示 PKCS#12,.p7b 表示 PKCS#7。但扩展名不是绝对的,-inform 和 -outform 参数或文件内容 (BEGIN 标记) 更可靠。
上面这些格式和命令是这份大全涵盖了生成 CSR 和转换证书格式的最常见场景。根据您的具体需求选择相应的命令即可。操作关键文件时务必谨慎!