用户想要了解一份完整的操作指南,而不是零散的片段。不过“大全”的范围其实很广,我需要聚焦在他明确提到的两个核心需求上: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 和转换证书格式的最常见场景。根据您的具体需求选择相应的命令即可。操作关键文件时务必谨慎!