OpenSSL 生成证书教程 – wiki基地


OpenSSL 生成证书超详细教程

引言:理解数字证书与 OpenSSL 的作用

在网络世界中,安全和信任至关重要。无论是访问一个网站、连接一个VPN,还是进行数据加密通信,我们都需要一种机制来验证对方的身份并确保通信内容的机密性和完整性。数字证书(Digital Certificate)正是实现这一目标的核心技术之一。

数字证书是一种电子文档,它使用加密技术将一个实体(例如个人、组织或服务器)的身份信息与一个公钥绑定在一起。这个绑定由一个受信任的第三方——证书颁发机构(Certificate Authority, CA)进行签名确认。通过验证证书上的签名,我们可以信任证书中包含的公钥确实属于声称拥有该公钥的实体。

OpenSSL 是一个强大、开源的软件库和命令行工具集,用于实现安全套接层(SSL)和传输层安全(TLS)协议,并提供了丰富的密码学功能。它是当前最广泛使用的 SSL/TLS 库,几乎所有流行的 Web 服务器、邮件服务器、VPN 软件以及许多其他网络应用都依赖 OpenSSL 来提供安全通信能力。

OpenSSL 不仅可以用于建立加密连接,它还提供了生成密钥对、创建证书签名请求(CSR)、颁发和管理数字证书、处理各种证书格式等功能。因此,掌握如何使用 OpenSSL 生成和管理证书,对于任何涉及网络安全、服务器配置或应用开发的技术人员来说都是一项基础且重要的技能。

本教程将带您深入了解如何使用 OpenSSL 命令行工具来生成不同类型的证书,从最简单的自签名证书到更复杂的 CA 证书和用于服务器的证书,涵盖私钥生成、CSR 创建、证书签发、不同格式转换以及一些高级配置选项。

第一部分:基础概念解析

在开始动手之前,理解几个核心概念对于后续操作至关重要:

  1. 密钥对 (Key Pair)

    • 私钥 (Private Key):一段保密的密钥,用于对数据进行签名(数字签名)或解密使用公钥加密的数据。私钥必须严格保密。
    • 公钥 (Public Key):与私钥配对的一段密钥,可以公开分享。用于验证私钥签名的有效性或加密需要由私钥解密的数据。
    • 公钥和私钥是数学上关联的一对,通过公钥无法推算出私钥。
  2. 证书签名请求 (Certificate Signing Request, CSR)

    • 这是一个包含了您的公钥以及关于您(或您的组织、服务器等)身份信息的文本文件。
    • 当您希望从一个 CA 申请证书时,您需要先生成一对密钥,然后使用您的私钥和身份信息创建一个 CSR 文件。您将这个 CSR 文件发送给 CA,CA 会验证您的身份,然后使用其自己的私钥对您的公钥和身份信息进行签名,生成最终的证书文件。
  3. 数字证书 (Digital Certificate)

    • 包含了申请者的公钥、身份信息以及由 CA 对这些信息的签名。
    • 验证证书的过程就是使用颁发该证书的 CA 的公钥来验证证书上的签名是否有效。如果签名有效,且您信任该 CA,那么您就可以信任证书中包含的公钥属于证书声称的实体。
    • 证书通常包含以下信息:
      • 证书持有者的公钥。
      • 证书持有者的身份信息(如组织名称、通用名称 CN、国家、省份等)。
      • 证书颁发机构(CA)的名称。
      • 证书的有效期(颁发日期和到期日期)。
      • CA 对证书内容的数字签名。
      • 证书的序列号。
      • 证书的版本。
      • 签名算法等。
  4. 证书颁发机构 (Certificate Authority, CA)

    • 一个受信任的实体,负责颁发、管理、吊销数字证书。
    • 主要的公共 CA(如 DigiCert, Sectigo, Let’s Encrypt)的根证书被预装在操作系统、浏览器和应用程序中,构成了一个信任链。
    • 您也可以建立自己的私有 CA,用于在内部网络或特定应用场景中颁发证书。
  5. 自签名证书 (Self-Signed Certificate)

    • 一种特殊的证书,它的签名不是由一个独立的 CA 签发的,而是由创建它自己的私钥签发的。
    • 这意味着证书的颁发者和持有者是同一个实体。
    • 自签名证书在内部测试、开发环境或对信任要求不高的私有网络中非常有用,因为它无需向第三方 CA 付费或申请。但请注意,浏览器或客户端通常会警告用户自签名证书不可信,因为其签名无法通过一个预装的公共 CA 根证书验证。

第二部分:安装与配置 OpenSSL

大多数 Linux/macOS 系统预装了 OpenSSL。您可以通过终端输入 openssl version 命令来检查是否安装以及安装的版本。

bash
openssl version

如果在 Windows 上,您可能需要手动下载和安装 OpenSSL。可以从 OpenSSL 官网(www.openssl.org)或其他可信来源获取预编译的二进制文件。安装后,确保 OpenSSL 的可执行文件路径已添加到系统的 PATH 环境变量中,这样您才能在任何目录下使用 openssl 命令。

OpenSSL 的行为受一个配置文件控制,通常名为 openssl.cnf。这个文件包含了默认的算法、目录路径、证书模板、扩展配置等。在执行某些高级操作(如添加证书扩展)时,可能需要修改或引用这个文件。您可以通过 openssl version -d 命令查找默认的配置文件目录。

第三部分:核心步骤:生成密钥对、CSR 和证书

以下是使用 OpenSSL 生成证书的基本流程和命令。我们将从生成自签名证书开始,因为它涵盖了生成密钥和证书的基本步骤。

步骤 1:生成私钥 (Generate Private Key)

私钥是您身份的核心。您需要先生成一个私钥,才能创建 CSR 或自签名证书。常用的私钥算法是 RSA 和 EC(椭圆曲线)。RSA 是传统的选择,而 EC 提供了在相同安全级别下更短的密钥长度和更高的效率。

1. 生成 RSA 私钥:

使用 genrsa 命令生成 RSA 私钥。-aes256 选项会使用 AES 256 位加密对私钥进行加密,并在生成时要求您设置一个密码。这是为了保护私钥文件本身的安全,即使文件泄露,没有密码也无法使用。-nodes 选项则表示不加密私钥(不设置密码)。对于 Web 服务器等需要自动启动的应用,通常使用 -nodes 选项,但务必确保私钥文件的访问权限受到严格控制。

“`bash

生成一个 2048 位的 RSA 私钥,不设置密码

openssl genrsa -out server.key 2048

生成一个 4096 位的 RSA 私钥,并用 AES256 加密,需要设置密码

openssl genrsa -aes256 -out server_encrypted.key 4096
“`

  • -out server.key: 指定输出的私钥文件名。
  • 2048 / 4096: 指定密钥的位数。位数越高,安全性理论上越强,但计算开销也会增加。目前 2048 位被认为足够安全,但 4096 位更推荐用于重要的服务器证书。
  • -aes256: 使用 AES 256 位加密私钥。
  • -nodes: 不加密私钥。

2. 生成 EC 私钥:

使用 genpkey 命令生成 EC 私钥。需要指定算法为 EC 并选择一个椭圆曲线(如 P-256, P-384, P-521)。P-256 是 NIST 标准曲线之一,提供大约 128 位安全强度,相当于 RSA 2048 位。P-384 提供大约 192 位安全强度,相当于 RSA 3072 位。

“`bash

生成一个使用 P-256 曲线的 EC 私钥,不设置密码

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out server_ec.key

生成一个使用 P-384 曲线的 EC 私钥,并用 AES256 加密

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-384 -aes256 -out server_ec_encrypted.key
“`

  • -algorithm EC: 指定算法为椭圆曲线。
  • -pkeyopt ec_paramgen_curve:P-256: 指定使用的椭圆曲线。
  • -out server_ec.key: 指定输出文件。

生成完成后,您会得到一个 .key 文件,这就是您的私钥文件。务必妥善保管!

步骤 2:创建证书签名请求 (Generate CSR)

CSR 包含了您的公钥和身份信息,用于向 CA 申请证书。如果您要创建自签名证书,通常可以跳过独立生成 CSR 的步骤,在生成证书时直接包含相关信息(见下一步骤的简化方法)。但是,理解 CSR 的生成过程对于向第三方 CA 申请证书至关重要。

使用 req 命令来生成 CSR。您需要指定私钥文件。

“`bash

假设我们已经生成了 server.key 私钥文件

openssl req -new -key server.key -out server.csr
“`

  • -new: 表示创建一个新的证书请求。
  • -key server.key: 指定用于生成 CSR 的私钥文件。
  • -out server.csr: 指定输出的 CSR 文件名。

执行此命令后,OpenSSL 会提示您输入一系列信息,这些信息将包含在 CSR 中,用于标识您的身份:

“`
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.


Country Name (2 letter code) [AU]:CN <– 输入国家代码,例如 CN
State or Province Name (full name) [Some-State]:Shanghai <– 输入省份
Locality Name (eg, city) []:Shanghai <– 输入城市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany <– 输入组织名称
Organizational Unit Name (eg, section) []:IT Department <– 输入组织单位名称(可选)
Common Name (e.g. server FQDN or YOUR name) []:www.example.com <– 非常重要 输入通用名称
Email Address []:[email protected] <– 输入邮箱地址(可选)

Please enter the following ‘extra’ attributes to be sent on to the certificate request
A challenge password []: <– 挑战密码(可选,用于向CA证明请求的合法性,通常留空)
An optional company name []: <– 可选公司名称(可选,通常留空)
“`

通用名称 (Common Name, CN) 是其中最关键的一项。
* 对于 SSL/TLS 服务器证书,CN 通常应该是服务器的完全限定域名 (FQDN),例如 www.example.commail.example.com。客户端(如浏览器)会验证证书的 CN 是否与它尝试连接的主机名匹配。
* 重要提示: 现代浏览器和操作系统已经不推荐或不再完全依赖 CN 进行主机名验证,而是依赖主题备用名称 (Subject Alternative Name, SAN) 扩展。虽然 CSR 过程提示输入 CN,但在最终证书中添加 SAN 是更推荐的做法(将在进阶部分讨论)。
* 对于 CA 证书,CN 通常是 CA 的名称,例如 My Root CA
* 对于客户端证书,CN 可以是用户的姓名或标识符。

完成信息输入后,会生成一个 .csr 文件。

步骤 3:生成自签名证书 (Generate Self-Signed Certificate)

有了私钥,我们可以直接生成一个自签名证书,而无需通过独立的 CSR 文件(OpenSSL 可以在一步内完成 CSR 的生成和自签名)。自签名证书的有效期由您自己设定。

使用 req 命令,结合 -x509 选项来生成自签名证书。

方法一:一步到位生成私钥和自签名证书 (推荐用于快速测试)

“`bash

生成一个 2048 位的 RSA 私钥(不加密)并同时生成一个有效期为 365 天的自签名证书

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt -subj “/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/CN=www.example.com”
“`

  • -x509: 表示输出一个 X.509 格式的自签名证书,而不是 CSR。
  • -nodes: 不加密生成的私钥。
  • -days 365: 设置证书的有效期为 365 天。
  • -newkey rsa:2048: 同时生成一个新的 RSA 私钥,位数为 2048。这等同于先执行 genrsa -out server.key 2048
  • -keyout server.key: 指定生成的私钥文件。
  • -out server.crt: 指定输出的证书文件。
  • -subj "/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/CN=www.example.com": 直接在命令行中指定证书的主题信息 (Subject Distinguished Name, DN),避免交互式输入。格式为 /attribute=value/attribute=value/...。这里 CN 是通用名称,O 是组织,L 是城市,ST 是省份,C 是国家。

方法二:使用已有的私钥生成自签名证书

如果您已经有了私钥(例如 server.key),可以使用以下命令:

“`bash

使用已有的 server.key 生成一个有效期 365 天的自签名证书

openssl req -x509 -days 365 -key server.key -out server.crt -subj “/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/CN=www.example.com”
“`

  • -key server.key: 指定使用哪个私钥来签名证书。
  • 其他选项与方法一类似。

方法三:使用已有的 CSR 生成自签名证书

如果您出于某种原因先生成了 CSR(例如 server.csr),也可以用它来生成自签名证书。

“`bash

使用已有的 server.csr 和 server.key 生成一个有效期 365 天的自签名证书

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
“`

  • -req: 表示输入是一个证书请求 (CSR)。
  • -in server.csr: 指定输入的 CSR 文件。
  • -signkey server.key: 指定用于签名证书的私钥。在自签名证书的情况下,这个私钥就是创建 CSR 时使用的私钥。
  • 其他选项类似。

生成完成后,您会得到一个 .crt 文件,这就是您的自签名证书。这个文件包含了您的公钥和身份信息,并由您自己的私钥进行了签名。

第四部分:生成 CA 证书及使用 CA 签发证书

自签名证书适用于测试和内部使用,但在实际生产环境中,通常需要由一个受信任的 CA 签发证书。您可以建立自己的私有 CA 来为内部服务签发证书。

步骤 1:生成 CA 的私钥

CA 的私钥是其身份的核心,用于签署其他证书。它必须得到最高级别的保护。

“`bash

生成一个 4096 位的 RSA 私钥用于 CA,并用 AES256 加密(强烈推荐为 CA 私钥设置密码)

openssl genrsa -aes256 -out ca.key 4096
“`

步骤 2:生成 CA 的自签名证书

CA 的证书是整个信任链的根。它是一个自签名证书,但它具有特殊的“CA”属性,表明它可以用来签署其他证书。

“`bash

使用 CA 私钥生成一个有效期更长(如 10 年)的 CA 自签名证书

openssl req -x509 -new -nodes -days 3650 -key ca.key -out ca.crt -subj “/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany CA/CN=My Root CA”
“`

  • -days 3650: 设置 CA 证书的有效期为 10 年。CA 证书的有效期通常比其签发的最终实体证书长得多。
  • -subj .../CN=My Root CA: 设置 CA 证书的通用名称,清晰地标识这是您的根 CA。
  • 注意: 这里使用了 -nodes 选项,但通常 CA 私钥是加密的(在上一步设置了密码)。执行此命令时会提示您输入 CA 私钥的密码。如果您上一步生成 CA 私钥时使用了 -aes256 选项,这里就不能用 -nodes 了。正确的命令应该是:
    bash
    openssl req -x509 -new -days 3650 -key ca.key -out ca.crt -subj "/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany CA/CN=My Root CA"
    # 执行时会提示输入ca.key的密码

生成完成后,您会得到 ca.key(CA 私钥)和 ca.crt(CA 证书)。将 ca.crt 分发给需要信任您的 CA 的客户端或系统。

步骤 3:使用 CA 签发证书 (Signing a CSR)

现在,假设您已经为服务器或其他实体生成了私钥和 CSR(例如 server.keyserver.csr,如前面步骤 1 和 2 所示,但这次不需要自签名),您可以使用您的 CA 来签发证书。

签发证书需要一个序列号文件和一个索引文件来跟踪颁发过的证书。这是 CA 证书管理的基础。

1. 创建必要的 CA 文件:

bash
touch index.txt # 创建一个空的索引文件
echo 1000 > serial # 创建一个序列号文件,并初始化第一个序列号(例如 1000)

  • index.txt: OpenSSL 将在此文件中记录每次颁发的证书信息。
  • serial: OpenSSL 将从此文件读取下一个可用的证书序列号,并在颁发后更新此文件。

2. 准备 OpenSSL 配置文件 (openssl.cnf):

为了正确地为服务器证书添加必要的扩展(如 SAN、keyUsage 等),您需要修改或创建一个 OpenSSL 配置文件,并在签发命令中引用它。找到您的 openssl.cnf 文件(可以使用 openssl version -d 查看默认位置)或者复制一份进行修改。

在配置文件中,找到或添加 [ v3_intermediate_ca ] 或类似的段落(如果是在构建多级 CA 体系)或 [ usr_cert ] 段落,并确保包含必要的扩展,特别是 subjectAltName。如果只是简单的测试,可以创建一个单独的扩展文件,例如 server.ext,内容如下:

“`ini
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE # 表明这不是一个CA证书
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment # 密钥用途
subjectAltName = @alt_names # 主题备用名称引用下面的alt_names段落

[alt_names]
DNS.1 = www.example.com # 替换为您的服务器域名
DNS.2 = example.com # 可以添加多个域名
IP.1 = 192.168.1.100 # 如果需要,可以添加IP地址
“`

  • basicConstraints=CA:FALSE: 这是一个最终实体证书,不是 CA 证书。
  • keyUsage: 定义了私钥的用途。对于 SSL/TLS 服务器,通常需要 digitalSignaturekeyEncipherment
  • subjectAltName: 定义主题备用名称。这是现代证书验证的关键。@alt_names 指向文件中的另一个段落,该段落列出了所有需要包含的域名或 IP 地址。

3. 使用 CA 签发证书:

使用 x509 命令,指定 CA 证书、CA 私钥、要签发的 CSR,以及配置文件(如果使用了扩展)。

“`bash

假设我们有 server.csr, ca.crt, ca.key, index.txt, serial 文件以及 server.ext 扩展文件

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256 -extfile server.ext -extensions v3_req
“`

  • -req: 输入是 CSR。
  • -in server.csr: 指定要签发的 CSR 文件。
  • -CA ca.crt: 指定 CA 证书文件。
  • -CAkey ca.key: 指定 CA 私钥文件。执行时会提示输入 CA 私钥的密码。
  • -CAcreateserial: 如果 serial 文件不存在,则创建它;如果存在,则读取其中的序列号,用于新证书,并自动将文件中的序列号加一。
  • -out server.crt: 指定输出的签发后的证书文件。
  • -days 365: 设置签发证书的有效期(从签发日期开始计算)。
  • -sha256: 使用 SHA-256 算法对证书进行签名(推荐使用更强的哈希算法)。
  • -extfile server.ext: 指定包含证书扩展的配置文件。
  • -extensions v3_req-extensions usr_cert: 指定在配置文件中使用哪个段落来获取扩展信息。具体名称取决于您的 openssl.cnfserver.ext 文件中定义。v3_req 通常用于从 CSR 阶段添加扩展(但在这里用 x509 签发时,通常是为最终证书添加扩展,所以可能需要指向为最终证书定义的扩展段落,如 usr_cert)。如果扩展定义在 server.extalt_names 段落,且 subjectAltName = @alt_names 定义在文件的默认或指定扩展段落,命令中的 -extensions 参数应指向包含 subjectAltName = @alt_names 的那个段落名(如果在 server.ext 中没有明确段落名,直接 -extensions subjectAltName 有时也奏效,但 -extfile 结合明确的段落名更规范)。更稳健的方式是修改 openssl.cnf 并引用其中的段落。例如,在 openssl.cnf[ usr_cert ] 段落添加 SAN 配置,然后在命令中使用 -extensions usr_cert

执行成功后,会生成 server.crt 文件,这就是由您的 CA 签发的服务器证书。

第五部分:查看证书、CSR 和私钥信息

使用 OpenSSL 可以轻松查看各种文件的内容和信息,这对于验证生成是否正确、排查问题非常有帮助。

1. 查看证书内容 (.crt):

bash
openssl x509 -in server.crt -text -noout

  • -in server.crt: 指定要查看的证书文件。
  • -text: 以文本格式输出证书的详细信息,包括版本、序列号、签名算法、颁发者、主题、有效期、公钥信息、扩展信息等。
  • -noout: 表示只输出文本信息,不输出证书本身的编码内容。

2. 查看 CSR 内容 (.csr):

bash
openssl req -in server.csr -text -noout

  • -in server.csr: 指定要查看的 CSR 文件。
  • -text, -noout: 作用同上。会显示 CSR 中的主题信息、公钥以及请求的属性(如扩展)。

3. 查看私钥内容 (.key):

“`bash
openssl rsa -in server.key -text -noout

如果是EC私钥

openssl pkey -in server_ec.key -text -noout
“`

  • -in server.key/-in server_ec.key: 指定要查看的私钥文件。
  • -text, -noout: 作用同上。会显示私钥的详细参数(如 RSA 的模数、指数,EC 的曲线参数等)。注意: 查看加密的私钥时会提示输入密码。

4. 验证私钥与证书/CSR 是否匹配:

私钥、CSR 和最终证书必须使用同一对密钥。可以通过比较它们的公钥模数 (RSA) 或公钥坐标 (EC) 来验证。

“`bash

查看私钥的公钥部分

openssl rsa -in server.key -modulus -noout # RSA
openssl pkey -in server_ec.key -pubout -text -noout # EC

查看 CSR 的公钥部分

openssl req -in server.csr -modulus -noout # RSA
openssl req -in server_ec.csr -pubkey -noout | openssl pkey -pubin -text -noout # EC (需要链式操作)

查看证书的公钥部分

openssl x509 -in server.crt -modulus -noout # RSA
openssl x509 -in server_ec.crt -pubkey -noout | openssl pkey -pubin -text -noout # EC (需要链式操作)
“`

将这三个输出进行比较。如果模数(对于 RSA)或公钥参数(对于 EC)完全一致,则表示它们是匹配的。

第六部分:证书格式转换

证书和私钥可以使用多种格式存储。PEM 和 DER 是最常见的编码格式,而 PKCS#12 (PFX) 是一种用于捆绑证书和私钥的容器格式。OpenSSL 可以在这些格式之间进行转换。

  • PEM (Privacy Enhanced Mail):最常见的文本格式,Base64 编码,文件通常以 -----BEGIN...----------END...----- 这样的边界标记开头和结尾,例如 -----BEGIN CERTIFICATE----------BEGIN PRIVATE KEY----------BEGIN CERTIFICATE REQUEST-----.pem, .crt, .cer, .key, .csr 文件通常是 PEM 格式。
  • DER (Distinguished Encoding Rules):二进制格式。.der 文件通常是 DER 编码的证书。
  • PKCS#12 (.p12 或 .pfx):一种二进制格式,用于将私钥、证书以及链中的中间 CA 证书打包到一个文件中,通常使用密码保护。常用于在不同系统或应用之间导入/导出证书密钥对(例如导入到 Windows 证书管理器或 Web 浏览器)。

1. PEM 转 DER:

“`bash

证书 PEM 转 DER

openssl x509 -in server.crt -outform DER -out server.der

私钥 PEM 转 DER (RSA)

openssl rsa -in server.key -outform DER -out server_rsa.der

私钥 PEM 转 DER (通用)

openssl pkey -in server.key -outform DER -out server_generic.der
“`

  • -in: 输入文件。
  • -outform DER: 指定输出格式为 DER。
  • -out: 输出文件。

2. DER 转 PEM:

“`bash

证书 DER 转 PEM

openssl x509 -in server.der -inform DER -outform PEM -out server.crt

私钥 DER 转 PEM (RSA)

openssl rsa -in server_rsa.der -inform DER -outform PEM -out server.key

私钥 DER 转 PEM (通用)

openssl pkey -in server_generic.der -inform DER -outform PEM -out server.key
“`

  • -inform DER: 指定输入格式为 DER。
  • -outform PEM: 指定输出格式为 PEM。

3. PEM 证书和私钥打包成 PKCS#12 (.pfx 或 .p12):

“`bash

将 server.crt (PEM 证书) 和 server.key (PEM 私钥) 打包成 server.pfx

openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt -certfile ca.crt # 如果有中间CA或根CA证书链,可以包含它们

执行时会提示设置一个导出密码

“`

  • -export: 表示执行导出操作。
  • -out server.pfx: 指定输出的 PKCS#12 文件名。
  • -inkey server.key: 指定私钥文件。
  • -in server.crt: 指定实体证书文件。
  • -certfile ca.crt: 可选,指定包含证书链中其他证书(如CA证书)的文件,这些证书也会被包含在 .pfx 文件中。对于由私有CA签发的证书,包含CA证书通常是必要的,以便导入时客户端能建立信任链。

4. 从 PKCS#12 文件中提取证书和私钥:

“`bash

从 server.pfx 中提取私钥 (输出 PEM 格式)

openssl pkcs12 -in server.pfx -nocerts -out server.key

从 server.pfx 中提取证书 (输出 PEM 格式)

openssl pkcs12 -in server.pfx -clcerts -nokeys -out server.crt

执行时会提示输入 .pfx 文件的导入密码和新私钥的导出密码(如果私钥需要加密)

“`

  • -in server.pfx: 指定输入的 PKCS#12 文件。
  • -nocerts: 只输出私钥。
  • -clcerts: 只输出客户端证书(即实体证书,不包括 CA 证书)。
  • -nokeys: 只输出证书。
  • -out: 输出文件。

第七部分:常见问题与安全注意事项

常见问题:

  1. “unable to load or access file”: 检查文件路径是否正确,以及当前用户是否有读取文件的权限。
  2. “Loading ‘screen’ into random state – done”: 这是一个正常的提示,OpenSSL 在生成密钥时需要足够的随机性。
  3. “Error loading key”, “bad decrypt”: 私钥文件被加密,但输入了错误的密码,或者私钥文件已损坏。
  4. 生成的证书浏览器提示不信任: 如果是自签名证书或由您自己的私有 CA 签发的证书,这是正常现象。要让浏览器信任,需要将自签名证书或 CA 证书导入到操作系统的信任存储中。
  5. 证书的 CN 与域名不匹配: 现代浏览器主要检查 SAN 扩展,但 CN 仍然是备份机制。确保您在生成 CSR 或自签名证书时输入的 CN 与您的域名一致,或者更重要的是,在证书扩展中正确配置了 Subject Alternative Name (SAN)。
  6. CA签发证书时报错 “txt_db:error, line 50…”: 这通常是 index.txtserial 文件的问题,或者 CA 配置(如 openssl.cnf)有问题。确保 index.txtserial 存在且格式正确(serial 文件只包含一个数字)。

安全注意事项:

  1. 保护您的私钥! 私钥是您身份的证明。如果私钥泄露,攻击者可以冒充您或您的服务器。对于 Web 服务器等应用,虽然为了自动化启动常常使用未加密的私钥 (-nodes 选项),但必须确保私钥文件具有严格的操作系统访问权限,仅允许运行服务的用户读取。对于 CA 私钥,强烈推荐使用密码加密,并将其存储在安全的地方。
  2. 选择合适的密钥长度: 对于 RSA,目前推荐至少 2048 位,4096 位更佳。对于 EC,推荐 NIST P-256 或更强的曲线(如 P-384)。
  3. 使用强的哈希算法进行签名: 避免使用 SHA-1(已被认为不安全),推荐使用 SHA-256 或更强的算法(如 SHA-384, SHA-512)。在 OpenSSL 命令行中可以使用 -sha256 等选项指定。
  4. 定期更新证书: 证书有有效期。在证书过期前及时更新。
  5. 理解信任链: 客户端验证证书时,会沿着证书链向上追溯,直到找到一个它信任的根 CA 证书。确保您提供的证书链完整,包含了所有必要的中间 CA 证书。
  6. 正确使用证书扩展: 特别是 Subject Alternative Name (SAN) 对于服务器证书至关重要,确保它包含了所有相关的域名和/或 IP 地址。

结论

OpenSSL 是一个功能极其强大的工具,掌握其证书生成和管理的基本操作,是构建和维护安全网络环境的基础。本教程详细介绍了使用 OpenSSL 生成自签名证书、CA 证书以及由 CA 签发证书的核心步骤、常用命令和参数,并涵盖了查看证书信息、格式转换以及重要的安全考虑。

通过实践这些命令,您将能够:

  • 为测试环境或内部服务快速生成自签名证书。
  • 搭建自己的私有 CA,用于管理内部证书体系。
  • 理解向公共 CA 申请证书所需的 CSR 文件的生成过程。
  • 查看和验证您拥有的证书和密钥文件。
  • 在不同的格式之间转换证书和私钥。

请记住,网络安全是一个持续的挑战。虽然 OpenSSL 提供了强大的工具,但正确的使用、妥善的私钥保管以及对新技术和最佳实践的持续学习同样重要。希望这篇教程能为您在 OpenSSL 的证书世界中提供坚实的基础。


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部