OpenSSL 证书生成:从零开始学会
在今天的网络世界中,安全性至关重要。无论是浏览网页、发送电子邮件,还是构建安全的服务器应用,我们都离不开加密技术,而数字证书是实现这些技术信任基础的关键组成部分。OpenSSL 是一个强大、开源的加密工具包,它提供了丰富的功能,包括密钥生成、证书生成、SSL/TLS 连接管理等等。掌握 OpenSSL 的证书生成技能,是理解和实践网络安全的重要一步。
本文将带你从零开始,深入学习如何使用 OpenSSL 生成各种类型的数字证书。我们将从基础概念讲起,逐步深入到更复杂的场景,包括自签名证书、模拟证书颁发机构(CA)以及生成由该 CA 签发的证书。
1. 基础概念:在开始之前
在动手实践之前,理解一些核心概念是很有必要的:
- 公钥基础设施 (PKI):PKI 是一套管理数字证书的系统,它涉及硬件、软件、策略和程序,用于创建、管理、分发、使用、存储和撤销数字证书。数字证书是 PKI 的核心。
- 密钥对 (Key Pair):包含一个私钥 (Private Key) 和一个公钥 (Public Key)。私钥是保密的,用于数字签名或解密由公钥加密的数据。公钥可以公开,用于验证数字签名或加密要发送给私钥所有者的数据。OpenSSL 主要使用 RSA 或 ECC 等算法生成密钥对。
- 私钥 (Private Key):一段秘密的数据,是密钥对中需要严格保管的部分。泄露私钥意味着证书的信任链被破坏。
- 公钥 (Public Key):从私钥派生出来的一段可以公开的数据。它与对应的私钥形成配对关系。
- 数字证书 (Digital Certificate):一个由受信任的第三方(证书颁发机构 CA)数字签名的文件,它将一个公钥与一个实体(如网站、个人或组织)的身份信息绑定在一起。证书的目的是验证公钥确实属于声称拥有它的人或实体。
- X.509 标准:大多数互联网上使用的数字证书都遵循 X.509 标准。这个标准定义了证书的格式,包括版本号、序列号、签名算法标识、颁发者名称、有效期、主体名称、主体的公钥信息以及各种扩展字段等。
- 证书颁发机构 (CA, Certificate Authority):一个受信任的实体,负责颁发、管理和撤销数字证书。CA 通过数字签名来保证证书中主体信息和公钥的绑定关系是真实有效的。浏览器和操作系统预装了根 CA 的证书,从而信任由这些根 CA 签发的证书以及由这些根 CA 信任的中间 CA 签发的证书。
- 自签名证书 (Self-Signed Certificate):一种特殊的证书,它不是由权威的第三方 CA 签发,而是由证书的主体自己签发。这意味着证书的签名者和被认证者是同一个实体。自签名证书可以用于测试、内部系统或非关键应用,但因为它没有经过广泛信任的 CA 验证,公共浏览器或客户端会对此发出警告。
- 证书签名请求 (CSR, Certificate Signing Request):一份包含你的公钥和申请者身份信息的请求文件。当你向一个真实的 CA 申请证书时,你需要先生成一个密钥对,然后用你的私钥生成一个 CSR,并将 CSR 发送给 CA。CA 会验证你的身份,然后使用它自己的私钥签发证书,证书中包含了你在 CSR 中提供的公钥和信息。
- 证书链 (Certificate Chain):由最终用户证书、一个或多个中间 CA 证书以及一个根 CA 证书组成的序列。每个证书(根证书除外)都由其链中更高级别的 CA 签发。客户端通过验证证书链直到找到一个其信任的根 CA 证书来验证最终用户证书的有效性。
2. OpenSSL 安装与基本用法
OpenSSL 是一个命令行工具。在大多数 Linux 和 macOS 系统上,OpenSSL 已经预装。在 Windows 上,你可以下载预编译的二进制文件或使用 Windows Subsystem for Linux (WSL)。
安装后,你可以在终端或命令行中输入 openssl version
来检查版本信息,确认安装成功。
OpenSSL 的命令结构通常是 openssl [子命令] [选项] [参数]
。例如,openssl genrsa
用于生成 RSA 私钥,openssl req
用于生成 CSR 或自签名证书,openssl x509
用于处理 X.509 证书。
3. 场景一:生成一个简单的自签名证书
这是最快速获取一个证书用于测试的方法。自签名证书包含私钥和公钥(嵌入在证书中),由自身签名。
步骤 1: 生成私钥
我们将生成一个 RSA 私钥,强度为 2048 位。私钥文件通常以 .key
结尾。
bash
openssl genrsa -out server.key 2048
genrsa
: 子命令,用于生成 RSA 私钥。-out server.key
: 指定输出文件名为server.key
。2048
: 指定密钥的长度为 2048 位(推荐)。更长的密钥(如 4096 位)提供更高的安全性,但生成和使用速度会稍慢。
执行命令后,文件 server.key
就生成了。这个文件包含了你的服务器的私钥,务必妥善保管,不要泄露。
默认情况下,生成的私钥是没有加密的(没有设置密码)。这方便自动化,但在安全上可能不够理想。如果你想为私钥设置一个密码,可以使用 -aes256
或其他加密算法选项:
bash
openssl genrsa -aes256 -out server.key 2048
此时,生成私钥时会要求你输入一个密码,之后每次使用这个私钥(例如启动使用了这个私钥的服务器时)都需要输入这个密码。
步骤 2: 生成自签名证书
有了私钥,我们可以直接生成一个自签名证书。证书文件通常以 .crt
或 .pem
结尾。PEM 是最常见的格式,它是一个文本文件,以 -----BEGIN ...-----
开头,-----END ...-----
结尾。
bash
openssl req -new -x509 -key server.key -out server.crt -days 365
req
: 子命令,用于处理 CSR 和证书生成。-new
: 表示生成一个新的请求(这里是生成一个用于自签名的请求)。-x509
: 这个关键选项告诉 OpenSSL 生成一个自签名证书,而不是一个 CSR。它会跳过CSR阶段,直接生成证书。-key server.key
: 指定用于签名的私钥文件。-out server.crt
: 指定输出的证书文件名为server.crt
。-days 365
: 指定证书的有效期为 365 天。- 如果你的私钥设置了密码,执行此命令时会要求输入私钥密码。
执行命令后,OpenSSL 会进入一个交互式提示,要求你输入一些证书信息。这些信息构成了证书的“主体”(Subject) 字段,通常格式为 /C=.../ST=.../L=.../O=.../OU=.../CN=...
。
Country Name (2 letter code) [AU]
: 国家代码,例如CN
(中国)。State or Province Name (full name) [Some-State]
: 省份或州。Locality Name (eg, city) []
: 城市。Organization Name (eg, company) [Internet Widgits Pty Ltd]
: 组织名称。Organizational Unit Name (eg, section) []
: 组织单位名称(可选)。Common Name (e.g. server FQDN or YOUR name) []
: 通用名称 (CN)。对于 SSL 证书,这个通常应该是服务器的完全限定域名 (FQDN),例如www.example.com
或localhost
(用于本地测试)。这是浏览器/客户端检查证书是否匹配它正在连接的网站的重要字段。Email Address []
: 电子邮件地址(可选)。
输入完成后,server.crt
文件就生成了。它包含了自签名证书的数据。
一步到位生成私钥和自签名证书 (无密码私钥)
你也可以使用一个命令直接生成无密码私钥和自签名证书:
bash
openssl req -newkey rsa:2048 -nodes -x509 -keyout server.key -out server.crt -days 365 -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/OU=IT/CN=localhost"
-newkey rsa:2048
: 生成一个新的 RSA 私钥(2048位)。-nodes
: 表示不加密私钥(No DES,虽然名字是DES,但实际是不加密)。-x509
: 生成自签名证书。-keyout server.key
: 将生成的私钥保存到server.key
文件。-out server.crt
: 将生成的证书保存到server.crt
文件。-days 365
: 有效期。-subj "/C=.../ST=.../..."
: 直接在命令行中指定主体信息,避免交互式输入。格式必须正确,字段之间用/
分隔。
这个命令非常方便,适合快速生成测试证书。
使用自签名证书
现在你有 server.key
和 server.crt
文件。你可以将它们配置到你的 Web 服务器(如 Apache, Nginx)或其他需要 SSL/TLS 的服务中。
缺点: 当客户端(如浏览器)连接到使用自签名证书的服务时,会提示证书不被信任,因为证书的颁发者是它自己,而客户端的信任库中并没有预装这个“颁发者”的证书。这对于内部测试是可接受的,但不适用于公共服务。
4. 场景二:模拟一个证书颁发机构 (CA) 并签发证书
对于更真实的场景,或者在内部网络中需要建立信任链,我们可以模拟一个自己的 CA。这个 CA 自己也是自签名的(称为“根 CA”),然后用它的私钥来签发其他证书(称为“子证书”或“终端实体证书”)。
这个过程更复杂,但更接近真实的 CA 工作流程。
步骤 1: 创建根 CA 的私钥
这是你的 CA 的身份基础。与服务器私钥一样,生成一个 RSA 私钥:
bash
openssl genrsa -aes256 -out ca.key 4096
- 这里我们使用了
-aes256
来加密私钥,因为 CA 的私钥极其重要,需要高度保护。 - 使用了 4096 位的密钥长度,对于 CA 来说,更高的安全性是推荐的。
- 生成时会要求你输入一个 CA 私钥的密码。务必记住并妥善保管这个密码和私钥文件!
步骤 2: 创建根 CA 的自签名证书
CA 自身的证书是一个自签名证书,它充当信任链的起点。
bash
openssl req -new -x509 -key ca.key -out ca.crt -days 3650 -sha256
req
: 生成请求。-new
: 新请求。-x509
: 自签名。-key ca.key
: 指定 CA 私钥用于签名(自签名)。-out ca.crt
: 输出 CA 证书文件。-days 3650
: CA 证书通常有效期非常长,这里设置为 10 年。-sha256
: 指定使用 SHA-256 摘要算法进行签名(推荐,SHA-1 已不安全)。- 如果 CA 私钥有密码,执行时会要求输入。
执行时,会要求输入 CA 证书的信息。对于 CA 证书,最重要的字段是 Common Name (CN)。它通常是 CA 的名称,例如 “My Test CA” 或 “Example Root CA”。
完成此步骤后,你拥有了 ca.key
(CA 私钥) 和 ca.crt
(CA 证书)。 ca.crt
文件是可以公开的,需要分发给所有将要信任这个 CA 签发的证书的客户端(例如,导入到操作系统或浏览器的信任存储区)。
步骤 3: 为服务器或客户端创建私钥
现在,我们需要为将要使用 CA 签发证书的实体(例如,一个 Web 服务器)生成它自己的密钥对。这个过程与场景一中生成服务器私钥相同:
bash
openssl genrsa -out server.key 2048
或者带密码:
bash
openssl genrsa -aes256 -out server.key 2048
步骤 4: 为服务器或客户端创建证书签名请求 (CSR)
接下来,使用上一步生成的私钥创建一个 CSR。CSR 包含了服务器的公钥和身份信息,但还没有被 CA 签名。
bash
openssl req -new -key server.key -out server.csr
req
: 生成请求。-new
: 新请求。-key server.key
: 指定用于生成 CSR 的私钥。-out server.csr
: 输出 CSR 文件。- 如果
server.key
有密码,会要求输入。
执行时,会要求输入服务器的身份信息。这里的 Common Name (CN) 字段必须是服务器的域名或 IP 地址(例如 www.example.com
或 192.168.1.100
)。CSR 文件 server.csr
包含了你的公钥和身份信息,你可以将它发送给 CA(在这里,我们自己就是 CA)。
步骤 5: 使用 CA 签发服务器证书
这是核心步骤,我们将使用 CA 的私钥和证书来签名服务器的 CSR,生成最终的服务器证书。
bash
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256
x509
: 子命令,用于处理 X.509 证书。在这里用于签发。-req
: 表示输入是 CSR。-in server.csr
: 指定要签名的 CSR 文件。-CA ca.crt
: 指定用于签名的 CA 证书。CA 证书包含 CA 的公钥,最终证书中会有 CA 证书的指纹,用于链验证。-CAkey ca.key
: 指定用于签名的 CA 私钥。这是 CA 用来对 CSR 进行数字签名的关键。-CAcreateserial
: 这个选项告诉 OpenSSL 自动创建一个证书序列号文件。CA 签发的每个证书都必须有一个唯一的序列号。OpenSSL 会在当前目录下创建一个名为ca.srl
的文件来记录下一个序列号。如果文件已存在,它会读取当前的序列号,用于新证书,并更新文件中的序列号。在真实的 CA 环境中,序列号的管理是非常重要的,需要一个可靠的系统来保证唯一性。-out server.crt
: 指定输出的服务器证书文件。-days 365
: 指定服务器证书的有效期。通常比 CA 证书短。-sha256
: 指定使用 SHA-256 算法进行签名。- 如果 CA 私钥有密码,会要求输入。
执行成功后,你将得到 server.crt
文件。这个文件就是由你的 CA 签发的服务器证书。
使用签发的证书
现在,你有 server.key
(服务器私钥) 和 server.crt
(由你的 CA 签发的服务器证书)。你可以将它们配置到你的 Web 服务器等服务中。
为了让客户端信任这个服务器证书,你需要将你的 CA 证书 (ca.crt
) 分发给客户端,并将其导入到客户端操作系统或应用程序的信任存储区。这样,客户端在验证 server.crt
时,会检查其签名是否由 ca.crt
进行,并且 যেহেতু ca.crt
在其信任库中,整个证书链就得到了信任。
5. 高级应用与配置文件:管理证书扩展和自动化
上面的步骤生成了功能基本的证书,但现代证书通常包含许多扩展字段(如 Subject Alternative Name, Key Usage 等),这些字段可以通过 OpenSSL 的配置文件 (openssl.cnf
) 来控制。使用配置文件还可以帮助自动化证书签发过程。
OpenSSL 在执行命令时会查找 openssl.cnf
文件。其位置取决于你的操作系统和安装方式。你可以复制默认配置文件进行修改,或创建自己的配置文件,并在命令中使用 -config <file>
选项指定。
我们创建一个名为 my_ca.cnf
的自定义配置文件作为示例。
“`ini
my_ca.cnf
[ req ]
Options for the ‘req’ command
default_bits = 2048
default_keyfile = server.key
default_md = sha256
prompt = no # 不交互式输入,使用 [ req_distinguished_name ] 中的信息
encrypt_key = no # 生成无密码的私钥
[ req_distinguished_name ]
countryName = CN
stateOrProvinceName = Beijing
localityName = Beijing
organizationName = MyOrg
organizationalUnitName = IT
commonName = localhost # CSR 的 CN
[ req_attributes ]
attributes to be added to the request
如果 prompt = yes, 这些会被交互式询问
如果 prompt = no, 这些将被忽略
[ v3_ca ]
Extensions for a CA certificate (when using req -x509)
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:TRUE
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ v3_req ]
Extensions for a CSR (req -new), these go into the CSR itself
Subject Alternative Name can be added here if desired, but it’s more common
to add it during signing based on request information or config.
Example:
subjectAltName = @alt_names
[ server_cert ]
Extensions for a server certificate (when signing with x509)
basicConstraints = critical, CA:FALSE # IMPORTANT: This is NOT a CA
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer # Links to the CA cert
keyUsage = critical, digitalSignature, keyEncipherment # Typical server usage
extendedKeyUsage = serverAuth # Server authentication
subjectAltName = @alt_names # Include SAN extension
[ alt_names ]
Subject Alternative Name (SAN) entries
DNS entries:
DNS.1 = localhost
DNS.2 = my-server.local
IP entries (if using IP addresses):
IP.1 = 192.168.1.100
IP.2 = 10.0.0.5
[ client_cert ]
Extensions for a client certificate
basicConstraints = critical, CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
keyUsage = critical, digitalSignature
extendedKeyUsage = clientAuth
“`
说明配置文件中的关键部分:
[ req ]
: 控制openssl req
命令的行为。prompt = no
用于非交互式生成 CSR/自签名证书,主体信息从[ req_distinguished_name ]
获取。encrypt_key = no
默认生成无密码私钥。[ req_distinguished_name ]
: 定义证书主体信息,当prompt = no
时使用。[ v3_ca ]
: 定义 CA 证书的扩展。basicConstraints = critical, CA:TRUE
是标识一个证书是 CA 证书的关键。keyUsage
指定了 CA 证书的用途。[ v3_req ]
: 定义 CSR 中的扩展。通常不在 CSR 中包含太多扩展,而是在签发时根据 CA 策略添加。[ server_cert ]
: 定义签发服务器证书时添加的扩展。basicConstraints = critical, CA:FALSE
明确这不是一个 CA。keyUsage
和extendedKeyUsage
定义了证书的使用场景。subjectAltName = @alt_names
指示从[ alt_names ]
部分获取 SAN 信息。[ alt_names ]
: 定义 Subject Alternative Name (SAN) 列表。这是现代证书中替代 CN 的重要字段,一个证书可以包含多个域名或 IP 地址。
使用配置文件重新执行步骤:
假设我们继续使用模拟 CA 的场景,现在用 my_ca.cnf
文件来控制过程。
步骤 1: 创建根 CA 的私钥 (同前)
bash
openssl genrsa -aes256 -out ca.key 4096
(这一步通常不需要配置文件控制)
步骤 2: 创建根 CA 的自签名证书 (使用配置文件)
为了让 CA 证书包含正确的扩展(如 basicConstraints=CA:TRUE
),我们可以使用配置文件。我们在 my_ca.cnf
中修改 [ req_distinguished_name ]
部分来填写 CA 的信息,并在命令中指定配置文件和使用的扩展部分。
“`bash
修改 my_ca.cnf 中的 [ req_distinguished_name ] 部分为 CA 的信息,例如 CN=My Test CA
…
[ req_distinguished_name ]
countryName = CN
stateOrProvinceName = Beijing
localityName = Beijing
organizationName = MyOrg
organizationalUnitName = CA Unit
commonName = My Test CA
…
openssl req -new -x509 -key ca.key -out ca.crt -days 3650 -sha256 -config my_ca.cnf -extensions v3_ca
“`
-config my_ca.cnf
: 指定使用的配置文件。-extensions v3_ca
: 告诉 OpenSSL 在生成证书时,使用配置文件中[ v3_ca ]
部分定义的扩展。
步骤 3: 为服务器创建私钥 (使用配置文件)
如果配置文件中 [ req ]
设置了 encrypt_key = no
,则生成的私钥没有密码。
bash
openssl genrsa -out server.key 2048 -config my_ca.cnf
(genrsa
命令本身不直接使用 -config
控制加密,加密选项是 -aes256
等。配置文件的 encrypt_key
选项主要影响 req -newkey
生成的私钥。所以这一步还是直接用 -aes256
控制加密更明确。)
“`bash
如果想加密私钥
openssl genrsa -aes256 -out server.key 2048
如果不想加密私钥
openssl genrsa -out server.key 2048
“`
步骤 4: 为服务器创建证书签名请求 (CSR) (使用配置文件)
使用配置文件来自动填写 CSR 信息和定义 CSR 中的扩展(如果需要)。我们在 my_ca.cnf
中修改 [ req_distinguished_name ]
部分为服务器的信息,并确保 [ alt_names ]
包含了服务器所需的 SAN。
“`bash
修改 my_ca.cnf 中的 [ req_distinguished_name ] 部分为服务器的信息,例如 CN=localhost
…
[ req_distinguished_name ]
countryName = CN
stateOrProvinceName = Beijing
localityName = Beijing
organizationName = MyOrg
organizationalUnitName = IT
commonName = localhost
…
修改或添加 [ alt_names ] 部分,例如 DNS.1 = localhost, DNS.2 = my-server.local 等
openssl req -new -key server.key -out server.csr -config my_ca.cnf -extensions v3_req
“`
-config my_ca.cnf
: 指定配置文件。-extensions v3_req
: 告诉 OpenSSL 使用配置文件中[ v3_req ]
部分定义的扩展添加到 CSR。
步骤 5: 使用 CA 签发服务器证书 (使用配置文件)
这是最关键的一步,使用配置文件来添加 SAN 和其他服务器证书所需的扩展。
bash
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256 -config my_ca.cnf -extensions server_cert
-config my_ca.cnf
: 指定配置文件。-extensions server_cert
: 告诉 OpenSSL 在签发证书时,使用配置文件中[ server_cert ]
部分定义的扩展。这将自动包含basicConstraints=CA:FALSE
,keyUsage
,extendedKeyUsage
, 以及最重要的subjectAltName
(因为它引用了[ alt_names ]
部分)。
通过使用配置文件,你可以精确控制证书的各个字段和扩展,这对于创建符合特定用途(如服务器认证、客户端认证、代码签名等)的证书至关重要。特别地,SAN 扩展是现代 Web 服务器证书 필수적인(强制的),因为它允许多个域名或 IP 地址被一个证书保护。
重要的注意事项:
- 序列号 (
ca.srl
): 使用-CAcreateserial
选项时,OpenSSL 会自动管理ca.srl
文件。在实际的 CA 环境中,这个文件需要被妥善管理,以确保序列号的唯一性。更复杂的 CA 实现会使用数据库或其他机制来跟踪证书和序列号。 - 配置文件的灵活运用: 你可以为不同的签发策略创建不同的配置文件部分(例如
[ server_cert ]
,[ client_cert ]
,[ code_signing ]
),并在签发时通过-extensions
选项选择合适的策略。 - 颁发者和主体: 签发后的服务器证书,其“颁发者”(Issuer) 字段将是 CA 证书的“主体”(Subject) 信息,其“主体”(Subject) 字段是 CSR 中的信息。这形成了证书链的关键联系。
6. 其他常用操作
除了生成证书,OpenSSL 还可以执行许多其他与证书相关的操作:
-
查看证书内容:
bash
openssl x509 -in server.crt -text -noout-in server.crt
: 指定要查看的证书文件。-text
: 以文本格式显示证书内容,包括所有字段和扩展。-noout
: 不输出 PEM 格式的证书本身。
-
查看 CSR 内容:
bash
openssl req -in server.csr -text -noout -
查看私钥内容:
bash
openssl rsa -in server.key -text -noout- 警告: 查看私钥内容会显示私钥的各个组成部分,如果私钥有密码,会要求输入密码。请谨慎使用此命令,确保环境安全。
-
验证证书是否由某个 CA 签发:
bash
openssl verify -CAfile ca.crt server.crt-CAfile ca.crt
: 指定用于验证的 CA 证书文件。server.crt
: 指定要验证的证书文件。- 如果验证通过,会输出
OK
。如果失败,会输出错误信息(例如,链不完整,签名无效,有效期问题,扩展不匹配等)。
-
将私钥从带密码转换为无密码:
bash
openssl rsa -in server.key -out server_nopass.key- 输入时会要求输入原私钥的密码。
-
将私钥从无密码转换为带密码:
bash
openssl rsa -in server_nopass.key -aes256 -out server.key- 输出时会要求设置新私钥的密码。
-
证书格式转换 (PEM to DER): PEM 是文本格式,DER 是二进制格式。
bash
openssl x509 -in server.crt -outform DER -out server.der -
证书格式转换 (DER to PEM):
bash
openssl x509 -in server.der -inform DER -outform PEM -out server.pem -
创建 PKCS#12 文件 (.pfx 或 .p12): 这种格式常用于 Windows 环境或需要将私钥、证书和中间 CA 证书打包在一起的场景。
bash
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt -certfile ca.crt-export
: 指定导出为 PKCS#12 格式。-out server.pfx
: 输出 PKCS#12 文件名。-inkey server.key
: 指定私钥文件。-in server.crt
: 指定服务器证书文件。-certfile ca.crt
: 可选,包含 CA 证书或其他中间证书,用于构建证书链。- 会要求为导出的 PKCS#12 文件设置一个密码。
7. 总结与最佳实践
通过本文的学习,你应该已经掌握了使用 OpenSSL 生成自签名证书、模拟 CA 并签发证书以及使用配置文件的基本方法。这些技能是理解和实践 PKI 的重要基础。
总结关键命令:
openssl genrsa
: 生成 RSA 私钥。openssl req
: 生成 CSR 或自签名证书。openssl x509
: 处理 X.509 证书,包括签发和查看。openssl rsa
: 处理 RSA 私钥。openssl verify
: 验证证书。openssl pkcs12
: 处理 PKCS#12 文件。
最佳实践:
- 保护私钥: CA 的私钥和服务器的私钥都是极其敏感的。务必将其存储在安全的位置,并限制访问权限。考虑使用密码加密私钥。
- 选择合适的密钥长度: 对于新的应用,推荐使用 2048 位或 4096 位的 RSA 密钥。ECC 密钥长度可以相对较短,但安全性等同。
- 使用 Subject Alternative Name (SAN): 不要仅仅依赖 Common Name (CN)。现代客户端(尤其是浏览器)主要依赖 SAN 来匹配域名/IP 地址。务必在签发证书时包含正确的 SAN 条目。
- 限制证书有效期: 较短的有效期可以降低密钥泄露的风险,并且更容易管理密钥轮换。
- 使用配置文件: 对于自动化和精确控制证书扩展,使用配置文件是必不可少的。
- 理解证书链: 确保你的服务器配置发送完整的证书链(服务器证书 -> 中间 CA 证书),以便客户端能够验证到其信任的根 CA。
8. 展望
掌握了这些基本技能后,你可以进一步探索 OpenSSL 更高级的功能,例如:
- 生成不同算法的密钥(如 ECC)。
- 使用更复杂的配置文件选项。
- 实现证书吊销列表 (CRL) 或在线证书状态协议 (OCSP)。
- 自动化 CA 签发流程(通常需要编写脚本结合 OpenSSL 命令)。
- 理解和使用其他 PKI 组件。
OpenSSL 是一个功能强大的工具,深入学习它的手册和各种命令选项,将为你打开网络安全的大门。希望本文能为你提供一个坚实的基础,让你 confidently 开始你的 OpenSSL 证书生成之旅!