使用 Openssl 创建 SSL 证书的步骤 – wiki基地


使用 OpenSSL 创建 SSL 证书的详细指南

引言:SSL/TLS 证书的重要性与 OpenSSL 的角色

在当今高度互联的网络世界中,保护数据的安全性和通信的隐私性至关重要。SSL(Secure Sockets Layer)及其后续版本 TLS(Transport Layer Security)协议正是为此而生。它们通过加密技术在客户端(如浏览器)和服务器之间建立一条安全的通信通道,确保数据在传输过程中不被窃听或篡改。

SSL/TLS 协议的信任基础在于 数字证书。数字证书由受信任的第三方机构,称为 证书颁发机构 (Certificate Authority, CA),签发。它将一个公钥与一个实体(如网站域名或组织)的身份绑定在一起。当浏览器访问一个配置了 SSL 证书的网站时,它会验证证书的有效性、是否由受信任的 CA 签发,以及证书中声明的身份是否与正在访问的网站匹配。如果一切正常,浏览器就会建立加密连接,并在地址栏显示一个锁形图标。

然而,在某些场景下,我们可能不需要由公共 CA 签发的证书,例如:

  • 内部网应用: 在公司内部网络中,我们可以建立自己的 CA,为内部服务器签发证书。客户端(如公司内部的计算机)可以被配置为信任这个内部 CA。
  • 开发和测试环境: 在开发或测试阶段,我们可能需要快速创建 SSL 证书来模拟生产环境,此时可以使用自签名证书(即自己作为 CA 为自己签发证书)。
  • 非公开服务: 对于不面向公共互联网的服务,自签名证书或内部 CA 签发的证书可能就足够了。

OpenSSL 是一个强大的、开源的加密工具包,它提供了实现 SSL/TLS 协议所需的核心功能,包括密钥生成、证书签发、加密、解密等。它是创建和管理 SSL/TLS 证书的事实标准工具,几乎所有主流的操作系统和服务器软件都支持或依赖 OpenSSL。

本文将详细介绍如何使用 OpenSSL 来创建和管理 SSL 证书,包括生成私钥、创建证书签名请求 (CSR),以及如何生成自签名证书和由内部 CA 签发证书的步骤。

一、准备工作:安装 OpenSSL

在使用 OpenSSL 之前,您需要确保它已经安装在您的系统上。大多数 Linux 和 macOS 系统都预装了 OpenSSL。您可以在终端中输入以下命令来检查:

bash
openssl version

如果 OpenSSL 已安装,您将看到版本信息。

如果您使用的是 Windows 系统,或者您的系统没有预装 OpenSSL,您可以从以下途径获取和安装:

  • Linux: 使用包管理器安装,例如 Debian/Ubuntu 使用 sudo apt update && sudo apt install openssl,CentOS/RHEL 使用 sudo yum install opensslsudo dnf install openssl
  • macOS: 通常已预装,也可以通过 Homebrew 安装:brew install openssl
  • Windows: 可以从 OpenSSL 官方网站(openssl.org)或其他第三方提供商下载预编译的二进制文件。请务必从可信来源下载。下载后,将其安装并可能需要将安装目录添加到系统环境变量 PATH 中,以便在任何位置执行 openssl 命令。

建议: 在执行证书操作之前,创建一个专门的目录来存放生成的文件,例如:

bash
mkdir ssl_certs
cd ssl_certs

这样可以避免文件混乱。

二、核心概念解析:理解 SSL/TLS 证书的组成

在深入操作步骤之前,理解几个核心概念对于正确使用 OpenSSL 至关重要:

  1. 非对称加密 (Asymmetric Cryptography): SSL/TLS 使用非对称加密算法(如 RSA、ECC)来协商和建立安全连接。这种算法使用一对密钥:一个公钥和一个私钥。

    • 私钥 (Private Key): 这是绝密的密钥。只有拥有私钥的实体才能解密用对应公钥加密的数据,或者对数据进行数字签名。私钥绝对不能泄露。通常保存在服务器上,文件扩展名可能是 .key.pem
    • 公钥 (Public Key): 这是可以公开分享的密钥。任何人都可以用它来加密数据,但只有拥有对应私钥的人才能解密。公钥也用于验证使用对应私钥进行的数字签名。公钥通常包含在证书中。
  2. 证书签名请求 (Certificate Signing Request, CSR): 这是一个包含您的公钥、组织信息(如组织名称、部门、国家等)以及您请求证书的域名(Common Name)的文件。您创建 CSR 的目的是将其提交给 CA,请求他们为您签发证书。CSR 文件扩展名通常是 .csr.pem。CSR 包含了您的公钥,但不包含您的私钥。

  3. 数字证书 (Digital Certificate): 这是 CA 签发的文件。它将您的公钥与您的身份信息(来自 CSR)绑定在一起,并由 CA 的私钥进行数字签名。这个签名证明了 CA 验证了您的身份并认可了这个公钥属于您。证书文件通常包含您的公钥和身份信息,但不包含您的私钥。文件扩展名可能是 .crt.cer.pem。证书是公开的,会发送给连接到您服务器的客户端。

  4. 证书颁发机构 (Certificate Authority, CA): 一个受信任的实体,负责验证请求证书的实体的身份,并为其签发数字证书。浏览器和操作系统内置了一个受信任的根 CA 列表。如果一个证书的信任链最终追溯到一个受信任的根 CA,那么这个证书就被认为是可信的。自签名证书就是自己扮演 CA 的角色。

三、使用 OpenSSL 创建 SSL 证书的基本流程

创建一个 SSL 证书(无论是自签名还是用于提交给 CA)通常遵循以下基本步骤:

  1. 生成私钥 (Private Key)。
  2. 生成证书签名请求 (CSR)。
  3. (可选)使用私钥和 CSR 生成自签名证书。
  4. (或者)将 CSR 提交给 CA 进行签发,然后接收 CA 签发的证书。

下面我们将详细分解这些步骤。

步骤 1:生成私钥

这是创建 SSL 证书的第一步,也是最关键的一步,因为它生成了您的身份基础——私钥。私钥的安全性至关重要。

OpenSSL 提供了多种算法来生成私钥,最常用的是 RSA 和 ECC (Elliptic Curve Cryptography)。RSA 算法历史悠久,兼容性好;ECC 算法相对较新,使用更短的密钥长度可以达到与 RSA 相同或更高的安全强度,且计算效率更高。现代实践中推荐使用 ECC,但考虑到兼容性,RSA 仍然广泛使用。我们将以 RSA 算法为例进行演示。

使用 genpkey 生成私钥 (推荐,现代用法)

genpkey 命令是生成私钥的通用接口,支持多种算法。

bash
openssl genpkey -algorithm RSA -out server.key -aes256

  • openssl genpkey: 生成私钥的命令。
  • -algorithm RSA: 指定使用 RSA 算法。
  • -out server.key: 指定输出文件的名称。server.key 是一个惯例,表示这是服务器的私钥文件。
  • -aes256: 指定使用 AES-256 算法对私钥文件进行加密。这会在生成私钥时提示您设置一个密码。每次使用这个私钥(例如启动 Web 服务器)时都需要输入这个密码。这增强了私钥的安全性,即使文件被盗,没有密码也无法使用。

执行上述命令后,您会被提示输入一个密码(Passphrase):

Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

输入并确认您的密码。请选择一个强密码。

使用 -nodes 选项生成无密码保护的私钥 (仅在必要时使用)

在某些自动化部署场景下,可能需要无密码保护的私钥,以避免启动服务时需要手动输入密码。但这会大幅降低私钥的安全性,因为它以未加密的明文形式存储。

bash
openssl genpkey -algorithm RSA -out server.key -nodes

  • -nodes: 表示不加密私钥文件(NO DES, 历史上指不使用 DES 算法加密,现在泛指不加密)。

选择密钥长度 (仅限 RSA)

对于 RSA 算法,您还可以指定密钥的长度(以比特为单位)。建议使用 2048 位或 4096 位。默认通常是 2048 位。

bash
openssl genpkey -algorithm RSA -out server.key -aes256 -pkeyopt rsa_keygen_bits:4096

  • -pkeyopt rsa_keygen_bits:4096: 为 RSA 算法指定密钥长度为 4096 位。

使用 genrsa 生成 RSA 私钥 (传统用法)

genrsa 是专门用于生成 RSA 私钥的旧命令,功能与 genpkey -algorithm RSA 类似。

bash
openssl genrsa -aes256 -out server.key 2048

  • openssl genrsa: 生成 RSA 私钥的命令。
  • -aes256: 使用 AES-256 加密。
  • -out server.key: 输出文件。
  • 2048: 指定密钥长度为 2048 位。

同样,使用 -nodes 可以生成无密码私钥:

bash
openssl genrsa -nodes -out server.key 2048

总结私钥生成:

  • 优先使用 genpkey 命令。
  • 除非自动化强制要求,强烈建议使用密码保护私钥(例如 -aes256 选项)。
  • 对于 RSA,密钥长度建议至少 2048 位,最好是 4096 位。
  • 生成的 server.key 文件包含了您的私钥(可能是加密的)。务必妥善保管,严禁泄露!

步骤 2:生成证书签名请求 (CSR)

在生成了私钥之后,下一步是创建一个 CSR 文件。CSR 包含了您的公钥以及一些用于识别您身份的信息。这些信息将被包含在最终的证书中。

使用 req 命令来生成 CSR。

bash
openssl req -new -key server.key -out server.csr

  • openssl req: OpenSSL 中用于生成证书请求和证书的命令。
  • -new: 表示创建一个新的证书请求。
  • -key server.key: 指定使用哪个私钥文件来生成 CSR。OpenSSL 会从私钥中提取公钥。
  • -out server.csr: 指定输出的 CSR 文件名。

执行此命令后,如果您在生成私钥时使用了密码,系统会首先要求您输入私钥的密码:

Enter PEM pass phrase for server.key:

输入密码后,系统会提示您输入一系列用于识别您的信息:

“`
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 for China)
State or Province Name (full name) [Some-State]:Beijing <- 输入省份
Locality Name (eg, city) []:Beijing <- 输入城市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Name <- 输入组织名称
Organizational Unit Name (eg, section) []:IT Department <- 输入部门名称 (可选)
Common Name (e.g. server FQDN or YOUR name) []:www.example.com <- 最重要!输入您的域名或IP
Email Address []:[email protected] <- 输入邮箱 (可选)

Please enter the following ‘extra’ attributes to be sent on your certificate request
A challenge password []: <- 通常留空
An optional company name []: <- 通常留空
“`

重要字段说明:

  • Country Name (国家代码): 2位字母的国家代码,例如 CN, US, UK。
  • State or Province Name (省/州): 完整的省份或州名称。
  • Locality Name (城市): 完整的城市名称。
  • Organization Name (组织名称): 您的公司或组织的全称。
  • Organizational Unit Name (部门名称): 可选,您组织内部的部门名称。
  • Common Name (CN): 这是证书最重要的字段之一,用于指定证书所保护的域名或 IP 地址。
    • 对于一个网站证书,这里应该填写您网站的完全限定域名 (FQDN),例如 www.example.com
    • 如果您需要保护 example.comwww.example.com,理论上需要使用 Subject Alternative Names (SAN) 扩展(后面会讲),但传统的 CN 字段通常用于主域名。
    • 如果是为 IP 地址签发证书,这里填写 IP 地址。
    • 如果您需要一个通配符证书(例如保护 *.example.com),Common Name 可以填写 *.example.com
  • Email Address (邮箱地址): 可选,联系邮箱。
  • A challenge password (挑战密码): 这是 CSR 本身的一个可选属性,与私钥密码不同。对于服务器证书,通常留空。 它主要用于证书吊销等场景,但在实践中很少使用。
  • An optional company name (可选公司名称): CSR 的另一个可选属性,通常留空。

完成信息填写后,server.csr 文件就生成了。这个文件包含了您的公钥和您输入的身份信息,等待被 CA 签名。

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

自签名证书是由您自己的私钥签名的证书,也就是说,您自己扮演了 CA 的角色。这种证书不被公共 CA 信任,浏览器访问时会显示安全警告,提示连接不安全或证书不受信任。自签名证书主要用于开发、测试或内部应用。

可以使用 req 命令并加上 -x509 选项来直接从私钥生成一个自签名证书。这实际上是结合了生成 CSR 和自己签名的过程。

bash
openssl req -x509 -new -key server.key -out server.crt -days 365

  • openssl req: 生成证书请求或证书的命令。
  • -x509: 指定生成一个 X.509 格式的自签名证书,而不是一个 CSR。
  • -new: 表示创建一个新的请求(这里隐含生成一个临时 CSR)。
  • -key server.key: 指定用于签名的私钥。
  • -out server.crt: 指定输出的证书文件名。server.crt 是常见的证书文件扩展名。
  • -days 365: 指定证书的有效期,单位为天。这里设置为 365 天(一年)。您可以根据需要设置更长时间。

执行此命令后,如果您使用了加密的私钥,会首先提示您输入私钥密码。然后,与生成 CSR 类似,您会被提示输入用于证书的身份信息(Country, State, etc.),包括 Common Name。

从现有 CSR 生成自签名证书 (另一种方式)

如果您已经生成了 server.csr 文件,也可以使用 x509 命令结合私钥来对其进行自签名:

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

  • openssl x509: OpenSSL 中用于处理 X.509 证书的命令。
  • -req -in server.csr: 指定输入一个 CSR 文件 (server.csr)。
  • -signkey server.key: 指定用于签名的私钥。
  • -out server.crt: 输出证书文件。
  • -days 365: 设置有效期。

这两种方法都可以生成自签名证书。第一种方法更直接,无需事先生成独立的 CSR 文件。

生成的 server.crt 文件就是您的自签名 SSL 证书。它包含了您的公钥、身份信息,以及您私钥的签名。

步骤 3B:将 CSR 提交给 CA 进行签发 (公共证书流程)

如果您需要一个由公共 CA(如 Let’s Encrypt, DigiCert, Sectigo 等)签发的、受浏览器信任的证书,您需要将上一步生成的 server.csr 文件提交给您选择的 CA。

这个过程通常不在 OpenSSL 命令行中完成,而是通过 CA 的网站界面或 API 进行。您需要:

  1. 访问 CA 的网站,选择您需要的证书类型(单域名、通配符、多域名 SAN 证书等)。
  2. 在 CA 的网站上,通常会有一个步骤要求您粘贴或上传您的 server.csr 文件的内容。
  3. CA 会进行身份验证(例如,通过发送邮件到 WHOIS 注册邮箱、在您的网站根目录放置特定文件、添加特定的 DNS 记录等方式)。
  4. 验证通过后,CA 会使用其私钥对您的 CSR 中的信息进行签名,生成您的最终证书文件(通常是一个 .crt.cer 文件)以及可能的中间证书文件(Intermediate Certificates)。
  5. 您从 CA 下载这些证书文件。

您收到的证书文件就是由可信 CA 签发的证书。这个证书包含了您的公钥、身份信息,以及 CA 的私钥签名。浏览器会信任这个签名,因为它信任签发该证书的 CA。

四、高级应用:Subject Alternative Names (SANs) 和内部 CA

使用 Subject Alternative Names (SANs)

在现代网络中,仅仅依靠 Common Name (CN) 来识别证书所保护的域名已经不够了。一个证书可能需要同时保护多个域名(如 example.comwww.example.com),甚至 IP 地址。这时就需要使用 Subject Alternative Names (SANs) 扩展。SANs 字段允许在证书中列出多个域名或 IP 地址。事实上,许多浏览器已经不再检查 CN 字段,而是优先检查 SANs 字段。

要在 CSR 和证书中包含 SANs,您需要使用一个 OpenSSL 配置文件。

  1. 创建 OpenSSL 配置文件:
    创建一个文本文件,例如 openssl.cnf,并添加以下内容(这只是一个示例,您可以根据需要修改):

    “`ini
    [ req ]
    default_bits = 2048
    prompt = no
    default_md = sha256
    distinguished_name = req_distinguished_name
    req_extensions = v3_req # 引入 v3_req 扩展

    [ req_distinguished_name ]
    countryName = CN
    stateOrProvinceName = Beijing
    localityName = Beijing
    organizationName = My Company Name
    organizationalUnitName = IT Department
    commonName = www.example.com # CN仍然需要,但现代浏览器主要看SAN

    [ v3_req ] # 这是定义 CSR 扩展的部分
    subjectAltName = @alt_names # 引用下面的 alt_names 部分

    [ alt_names ] # 在这里列出所有的 Subject Alternative Names
    DNS.1 = www.example.com # DNS 类型,第一个域名
    DNS.2 = example.com # DNS 类型,第二个域名
    DNS.3 = sub.example.com # DNS 类型,第三个域名
    IP.1 = 192.168.1.100 # IP 类型
    “`

    • [ req ]: 配置 req 命令的默认行为。
    • prompt = no: 使用配置文件时,建议关闭交互式提示,直接从文件中读取 DN 信息。
    • req_extensions = v3_req: 指定使用 v3_req 区块中定义的扩展。
    • [ req_distinguished_name ]: 定义 DN 信息,对应生成 CSR 时需要输入的那些字段。
    • [ v3_req ]: 定义证书请求的 V3 扩展。
    • subjectAltName = @alt_names: 将 Subject Alternative Name 扩展的值设置为 alt_names 区块中定义的内容。
    • [ alt_names ]: 定义具体的 SANs 列表。
    • DNS.n: 表示一个域名类型的 SAN。
    • IP.n: 表示一个 IP 地址类型的 SAN。
  2. 使用配置文件生成 CSR:
    在生成 CSR 时,使用 -config 选项指定刚刚创建的配置文件。

    bash
    openssl req -new -key server.key -out server_san.csr -config openssl.cnf

    -config openssl.cnf: 指定使用 openssl.cnf 作为配置文件。

    如果您使用 -nodes 生成了无密码私钥,这个命令会直接生成 CSR。如果私钥有密码,依然会提示输入私钥密码。由于在配置文件中设置了 prompt = no,OpenSSL 会直接使用文件中的 DN 信息,不会再进行交互式询问。

    生成的 server_san.csr 就包含了 SANs 信息。您可以将这个 CSR 提交给支持 SANs 的 CA。

  3. 使用配置文件生成包含 SANs 的自签名证书:
    同样,生成自签名证书时也可以使用配置文件:

    bash
    openssl req -x509 -new -key server.key -out server_san.crt -days 365 -config openssl.cnf -extensions v3_req

    • -extensions v3_req: 特别指定在自签名证书中使用配置文件中 [ v3_req ] 定义的扩展。

    生成的 server_san.crt 就是包含 SANs 的自签名证书。

检查 CSR 或证书中的 SANs:

您可以使用 OpenSSL 命令来查看生成的 CSR 或证书中是否包含了 SANs:

“`bash

检查 CSR

openssl req -text -noout -in server_san.csr

检查证书

openssl x509 -text -noout -in server_san.crt
“`

在输出中查找 “X509v3 Subject Alternative Name” 部分,您应该能看到您在配置文件中定义的 SANs 列表。

构建简单的内部 CA

如果您需要在内部网络中建立一个受信任的证书体系,可以自己扮演根 CA 的角色。基本流程如下:

  1. 创建 Root CA 私钥。
  2. 创建 Root CA 自签名证书。
  3. 为服务器/客户端生成私钥和 CSR(如前所述)。
  4. 使用 Root CA 私钥和证书签名服务器/客户端的 CSR。
  5. (可选)创建中间 CA。

步骤 1:创建 Root CA 私钥

bash
openssl genpkey -algorithm RSA -out ca.key -aes256 -pkeyopt rsa_keygen_bits:4096

为 CA 私钥设置一个强密码并妥善保管。

步骤 2:创建 Root CA 自签名证书

Root CA 证书是整个信任链的起点,它自己签自己。

bash
openssl req -x509 -new -key ca.key -out ca.crt -days 3650 -sha256 -extensions v3_ca -config <(cat openssl.cnf <(echo '[ v3_ca ]'; echo 'basicConstraints = critical,CA:TRUE'; echo 'keyUsage = critical,digitalSignature,cRLSign,keyCertSign'))

  • -days 3650: CA 证书的有效期通常设置得非常长(例如 10 年或更长)。
  • -sha256: 指定签名哈希算法为 SHA-256。
  • -extensions v3_ca: 使用 v3_ca 扩展。
  • -config <(...): 这是一个技巧,将标准输入重定向为一个临时的配置文件内容。这样做是为了方便地在命令行中添加 basicConstraints=critical,CA:TRUEkeyUsage 扩展,这些是 Root CA 证书必须包含的重要扩展。basicConstraints=critical,CA:TRUE 表明这是一个 CA 证书,可以用于签发其他证书。keyUsage 定义了密钥的用途。
  • 填写 Root CA 的身份信息(Common Name 可以是 “My Internal Root CA”)。

生成的 ca.key 是 CA 私钥,ca.crt 是 CA 证书。将 ca.crt 分发并安装到客户端的信任存储中,客户端就会信任由这个 CA 签发的所有证书。

步骤 3:为服务器生成私钥和 CSR (同上)

bash
openssl genpkey -algorithm RSA -out server.key -aes256
openssl req -new -key server.key -out server.csr -config openssl.cnf # 使用SANs配置文件

步骤 4:使用 Root CA 签发服务器证书

这个过程需要用到 Root CA 的私钥 (ca.key) 和证书 (ca.crt),以及服务器的 CSR (server.csr)。

bash
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server_signed.crt -days 365 -sha256 -extensions v3_req -extfile openssl.cnf

  • -req -in server.csr: 指定输入的 CSR。
  • -CA ca.crt: 指定用于签名的 CA 证书。
  • -CAkey ca.key: 指定用于签名的 CA 私钥。如果您给 CA 私钥设置了密码,会提示输入。
  • -CAcreateserial: 自动创建一个序列号文件(通常名为 ca.srl),用于记录签发的证书序列号,防止重复。
  • -out server_signed.crt: 输出签发好的服务器证书。
  • -days 365: 设置服务器证书的有效期。
  • -sha256: 指定签名哈希算法。
  • -extensions v3_req -extfile openssl.cnf: 使用配置文件中 [ v3_req ] 定义的扩展(例如 SANs)应用到签发的证书上。

生成的 server_signed.crt 文件就是由您的 Root CA 签发的服务器证书。将 server.keyserver_signed.crt 部署到您的服务器上。客户端如果信任您的 Root CA (ca.crt),就会信任这个服务器证书。

更复杂的 CA 管理: OpenSSL 的 ca 命令提供了更完整的 CA 管理功能,包括维护证书库、吊销列表 (CRL) 等。对于简单的内部 CA,上述 x509 -CA 命令可能更直接。

五、证书格式转换

OpenSSL 支持多种证书和密钥格式。最常见的是 PEM (Privacy Enhanced Mail) 格式,它是 Base64 编码的文本格式,通常以 -----BEGIN...----- 开头,以 -----END...----- 结尾。文件扩展名通常是 .pem, .crt, .cer, .key, .csr

其他常见的格式包括:

  • DER (Distinguished Encoding Rules): 二进制格式。Java 应用程序常使用。文件扩展名通常是 .der, .cer
  • PKCS#12 (PFX): 一种二进制格式,可以将私钥和证书(包括中间证书)捆绑在一起,通常受密码保护。常用于 Windows 服务器 (.pfx) 和 Java KeyStores (.p12)。

以下是一些常用的格式转换命令:

  1. PEM 转 DER 格式证书:

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

  2. DER 转 PEM 格式证书:

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

  3. PEM 格式私钥转 DER 格式私钥:

    “`bash
    openssl pkey -in server.key -outform DER -out server_der.key

    或者对于旧版私钥格式

    openssl rsa -in server.key -outform DER -out server_der.key

    “`

  4. DER 格式私钥转 PEM 格式私钥:

    “`bash
    openssl pkey -in server_der.key -inform DER -outform PEM -out server.key

    或者

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

    “`

  5. 将 PEM 格式私钥和证书合并转换为 PKCS#12 (.pfx 或 .p12) 格式:

    bash
    openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt -certfile ca.crt

    • -export: 指定执行导出操作。
    • -out server.pfx: 指定输出文件。
    • -inkey server.key: 指定输入的私钥文件。
    • -in server.crt: 指定输入的证书文件(通常是您的服务器证书)。
    • -certfile ca.crt: 重要! 指定额外的证书文件,通常是中间 CA 证书或根 CA 证书链。这样客户端验证时就能找到完整的信任链。如果有多个中间证书,可以在配置文件中列出或串联到一个文件里指定。
    • 执行时会提示设置一个导出密码,用于保护导出的 PFX 文件。
  6. 从 PKCS#12 文件中提取 PEM 格式私钥和证书:

    bash
    openssl pkcs12 -in server.pfx -nocerts -out server.key
    openssl pkcs12 -in server.pfx -nokeys -out server.crt

    • -nocerts: 只导出私钥。
    • -nokeys: 只导出证书。
    • 执行时需要输入 PFX 文件的导出密码。

六、查看证书、CSR 或私钥内容

使用 OpenSSL 可以方便地查看生成的文件内容,这对于验证信息是否正确或调试问题非常有用。

  • 查看证书内容:

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

    -text: 以文本形式显示证书的详细信息。
    -noout: 不输出 PEM 编码的证书本身,只输出文本信息。
    -in server.crt: 指定输入的证书文件。

  • 查看 CSR 内容:

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

  • 查看私钥内容 (慎用,可能暴露私钥):

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

    或者对于RSA私钥

    openssl rsa -text -noout -in server.key

    “`

    如果您使用的是加密的私钥,会提示输入密码。查看私钥的文本内容会显示私钥的参数,如果是在不安全的终端或环境中操作,存在泄露风险。 通常只需要验证私钥是否能与证书匹配即可,无需查看其具体数学参数。

  • 验证私钥和证书是否匹配:
    证书和私钥是一对。您可以使用以下命令验证它们是否匹配(即公钥部分是否一致):

    “`bash

    获取私钥的 Modulus (公钥的一部分)

    openssl pkey -in server.key -modulus -noout

    或者对于RSA私钥

    openssl rsa -in server.key -modulus -noout

    获取证书的 Modulus

    openssl x509 -in server.crt -modulus -noout

    获取 CSR 的 Modulus

    openssl req -in server.csr -modulus -noout
    “`

    如果输出的 Modulus 值完全相同,则表示私钥、证书和 CSR 是匹配的。

七、安全最佳实践

  • 保护私钥: 私钥是您身份的基石,一旦泄露,攻击者就可以冒充您。
    • 始终使用密码保护私钥文件(-aes256)。虽然这会增加服务器启动时的复杂性,但在大多数情况下是值得的。对于需要自动化启动的服务器,确保存放无密码私钥的环境绝对安全。
    • 限制私钥文件的访问权限,只允许必要的用户或服务读取(例如,Web 服务器通常只需要读权限)。例如在 Linux 上可以使用 chmod 400 server.key
    • 不要将私钥文件放置在 Web 可访问的目录中。
  • 使用强密码: 为私钥和 PFX 文件设置一个足够长且复杂的密码。
  • 定期更新证书: 证书都有有效期。在证书过期前及时更新。计划好更新流程,避免服务中断。
  • 备份: 备份您的私钥、证书文件,以及 CA 的私钥和证书(如果是自建 CA)。
  • 遵循最小权限原则: 只有需要执行 OpenSSL 操作的用户才应该拥有相关文件的写入权限。

结论

OpenSSL 是一个功能强大且灵活的工具,用于创建和管理 SSL/TLS 证书。通过本文的详细介绍,您应该掌握了使用 OpenSSL 生成私钥、创建 CSR、生成自签名证书以及处理 SANs 和构建简单内部 CA 的基本步骤。

理解每个步骤背后的概念(私钥、公钥、CSR、证书、CA)对于正确操作至关重要。无论是为公共网站申请证书,还是为内部服务创建信任体系,OpenSSL 都是一个不可或缺的工具。

请记住,对于面向公共互联网的服务,您通常需要从受信任的公共 CA 获取证书。自签名证书主要用于内部网络、开发和测试目的。

熟练掌握 OpenSSL 的使用,将帮助您更好地管理您的网络安全基础设施。在使用过程中,务必注意保护您的私钥安全,这是数字信任体系中最关键的一环。希望这篇详细的指南能为您提供帮助!


发表评论

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

滚动至顶部