使用 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 openssl
或sudo dnf install openssl
。 - macOS: 通常已预装,也可以通过 Homebrew 安装:
brew install openssl
。 - Windows: 可以从 OpenSSL 官方网站(openssl.org)或其他第三方提供商下载预编译的二进制文件。请务必从可信来源下载。下载后,将其安装并可能需要将安装目录添加到系统环境变量 PATH 中,以便在任何位置执行
openssl
命令。
建议: 在执行证书操作之前,创建一个专门的目录来存放生成的文件,例如:
bash
mkdir ssl_certs
cd ssl_certs
这样可以避免文件混乱。
二、核心概念解析:理解 SSL/TLS 证书的组成
在深入操作步骤之前,理解几个核心概念对于正确使用 OpenSSL 至关重要:
-
非对称加密 (Asymmetric Cryptography): SSL/TLS 使用非对称加密算法(如 RSA、ECC)来协商和建立安全连接。这种算法使用一对密钥:一个公钥和一个私钥。
- 私钥 (Private Key): 这是绝密的密钥。只有拥有私钥的实体才能解密用对应公钥加密的数据,或者对数据进行数字签名。私钥绝对不能泄露。通常保存在服务器上,文件扩展名可能是
.key
或.pem
。 - 公钥 (Public Key): 这是可以公开分享的密钥。任何人都可以用它来加密数据,但只有拥有对应私钥的人才能解密。公钥也用于验证使用对应私钥进行的数字签名。公钥通常包含在证书中。
- 私钥 (Private Key): 这是绝密的密钥。只有拥有私钥的实体才能解密用对应公钥加密的数据,或者对数据进行数字签名。私钥绝对不能泄露。通常保存在服务器上,文件扩展名可能是
-
证书签名请求 (Certificate Signing Request, CSR): 这是一个包含您的公钥、组织信息(如组织名称、部门、国家等)以及您请求证书的域名(Common Name)的文件。您创建 CSR 的目的是将其提交给 CA,请求他们为您签发证书。CSR 文件扩展名通常是
.csr
或.pem
。CSR 包含了您的公钥,但不包含您的私钥。 -
数字证书 (Digital Certificate): 这是 CA 签发的文件。它将您的公钥与您的身份信息(来自 CSR)绑定在一起,并由 CA 的私钥进行数字签名。这个签名证明了 CA 验证了您的身份并认可了这个公钥属于您。证书文件通常包含您的公钥和身份信息,但不包含您的私钥。文件扩展名可能是
.crt
、.cer
或.pem
。证书是公开的,会发送给连接到您服务器的客户端。 -
证书颁发机构 (Certificate Authority, CA): 一个受信任的实体,负责验证请求证书的实体的身份,并为其签发数字证书。浏览器和操作系统内置了一个受信任的根 CA 列表。如果一个证书的信任链最终追溯到一个受信任的根 CA,那么这个证书就被认为是可信的。自签名证书就是自己扮演 CA 的角色。
三、使用 OpenSSL 创建 SSL 证书的基本流程
创建一个 SSL 证书(无论是自签名还是用于提交给 CA)通常遵循以下基本步骤:
- 生成私钥 (Private Key)。
- 生成证书签名请求 (CSR)。
- (可选)使用私钥和 CSR 生成自签名证书。
- (或者)将 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.com
和www.example.com
,理论上需要使用 Subject Alternative Names (SAN) 扩展(后面会讲),但传统的 CN 字段通常用于主域名。 - 如果是为 IP 地址签发证书,这里填写 IP 地址。
- 如果您需要一个通配符证书(例如保护
*.example.com
),Common Name 可以填写*.example.com
。
- 对于一个网站证书,这里应该填写您网站的完全限定域名 (FQDN),例如
- 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 进行。您需要:
- 访问 CA 的网站,选择您需要的证书类型(单域名、通配符、多域名 SAN 证书等)。
- 在 CA 的网站上,通常会有一个步骤要求您粘贴或上传您的
server.csr
文件的内容。 - CA 会进行身份验证(例如,通过发送邮件到 WHOIS 注册邮箱、在您的网站根目录放置特定文件、添加特定的 DNS 记录等方式)。
- 验证通过后,CA 会使用其私钥对您的 CSR 中的信息进行签名,生成您的最终证书文件(通常是一个
.crt
或.cer
文件)以及可能的中间证书文件(Intermediate Certificates)。 - 您从 CA 下载这些证书文件。
您收到的证书文件就是由可信 CA 签发的证书。这个证书包含了您的公钥、身份信息,以及 CA 的私钥签名。浏览器会信任这个签名,因为它信任签发该证书的 CA。
四、高级应用:Subject Alternative Names (SANs) 和内部 CA
使用 Subject Alternative Names (SANs)
在现代网络中,仅仅依靠 Common Name (CN) 来识别证书所保护的域名已经不够了。一个证书可能需要同时保护多个域名(如 example.com
和 www.example.com
),甚至 IP 地址。这时就需要使用 Subject Alternative Names (SANs) 扩展。SANs 字段允许在证书中列出多个域名或 IP 地址。事实上,许多浏览器已经不再检查 CN 字段,而是优先检查 SANs 字段。
要在 CSR 和证书中包含 SANs,您需要使用一个 OpenSSL 配置文件。
-
创建 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。
-
使用配置文件生成 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。 -
使用配置文件生成包含 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 的角色。基本流程如下:
- 创建 Root CA 私钥。
- 创建 Root CA 自签名证书。
- 为服务器/客户端生成私钥和 CSR(如前所述)。
- 使用 Root CA 私钥和证书签名服务器/客户端的 CSR。
- (可选)创建中间 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:TRUE
和keyUsage
扩展,这些是 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.key
和 server_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)。
以下是一些常用的格式转换命令:
-
PEM 转 DER 格式证书:
bash
openssl x509 -in server.crt -outform DER -out server.der -
DER 转 PEM 格式证书:
bash
openssl x509 -in server.der -inform DER -outform PEM -out server.pem -
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
“`
-
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
“`
-
将 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 文件。
-
从 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 的使用,将帮助您更好地管理您的网络安全基础设施。在使用过程中,务必注意保护您的私钥安全,这是数字信任体系中最关键的一环。希望这篇详细的指南能为您提供帮助!