OpenSSL 证书生成全攻略
OpenSSL 是一个功能强大且广泛使用的开源工具包,用于实现安全套接字层 (SSL) 和传输层安全 (TLS) 协议。它提供了丰富的加密功能,包括生成、管理和验证数字证书、私钥以及证书签名请求 (CSR)。本攻略将详细介绍如何使用 OpenSSL 进行证书的生成与管理,帮助您在各种场景下(如测试环境、内部系统或商业证书申请)确保网络通信安全。
1. OpenSSL 简介
数字证书是网络安全基础设施的核心组成部分,它们用于在互联网上验证实体(如服务器、客户端)的身份,并为数据传输提供加密和完整性保护。OpenSSL 允许用户创建不同类型的证书,从简单的自签名证书到复杂的证书链,为您的应用程序和服务提供安全保障。
2. OpenSSL 安装
在开始之前,请确保您的系统已安装 OpenSSL。您可以通过运行 openssl version 命令来检查安装情况。
-
Linux (Debian/Ubuntu/CentOS/Fedora): 大多数 Linux 发行版都预装了 OpenSSL。如果未安装,可以使用包管理器进行安装:
“`bash
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install opensslCentOS/Fedora
sudo yum install openssl
“`
* macOS: macOS 通常也预装了 OpenSSL。
* Windows: Windows 用户可以从第三方发行版(如 Win32 OpenSSL)下载并安装。
3. 生成私钥
私钥是证书安全的基础。它用于解密由对应公钥加密的数据。私钥的安全性至关重要,务必妥善保管。
3.1 生成 RSA 私钥
RSA 是一种最常用的非对称加密算法。建议密钥长度至少为 2048 位,更安全的选择是 4096 位。
-
生成不带密码的 RSA 私钥 (2048 位):
bash
openssl genrsa -out private.key 2048
此命令将生成一个名为private.key的 2048 位 RSA 私钥文件。 -
生成带密码的 RSA 私钥 (4096 位):
bash
openssl genrsa -aes256 -out private_encrypted.key 4096
-aes256选项会使用 AES256 算法加密私钥,并在生成时提示您设置一个密码。每次使用该私钥时都需要输入此密码。
3.2 生成 ECC 私钥 (可选)
椭圆曲线密码学 (ECC) 提供了与 RSA 相当的安全强度,但可以使用更短的密钥长度,从而提高性能。
- 生成 ECC 私钥 (使用 prime256v1 曲线):
bash
openssl ecparam -name prime256v1 -genkey -noout -out ec_private.key
prime256v1是一个常用的椭圆曲线名称。您可以根据需求选择其他曲线。
4. 生成证书签名请求 (CSR)
证书签名请求 (CSR) 是您向证书颁发机构 (CA) 申请证书时提交的文件。它包含您的公钥和一些身份信息。
- 通过私钥生成 CSR:
bash
openssl req -new -key private.key -out server.csr
执行此命令后,系统会提示您输入一系列信息,这些信息将包含在 CSR 中。请根据提示填写准确的信息:- Country Name (2 letter code): 国家代码 (例如:CN, US)。
- State or Province Name (full name): 省份名称。
- Locality Name (eg, city): 城市名称。
- Organization Name (eg, company): 组织或公司名称。
- Organizational Unit Name (eg, section): 部门名称 (可选)。
- Common Name (e.g., your domain name): 最重要的字段。对于服务器证书,应填写您的完全限定域名 (FQDN),例如
www.example.com或api.yourdomain.com。对于客户端证书,可以是用户ID或名称。 - Email Address: 电子邮件地址。
- A challenge password: 挑战密码 (可选,通常留空)。
- An optional company name: 可选公司名称 (可选,通常留空)。
5. 生成自签名证书
自签名证书是由其自身私钥签名的证书。它们提供了加密功能,但由于没有受信任的第三方 CA 验证其身份,浏览器或客户端会显示警告。自签名证书通常用于开发、测试环境或内部系统,不建议用于生产环境。
5.1 直接生成自签名证书 (包含私钥)
此方法可以一步到位地生成私钥和自签名证书。
bash
openssl req -x509 -newkey rsa:2048 -keyout private.key -out certificate.crt -days 365 -nodes
* -x509: 指示生成自签名证书而不是 CSR。
* -newkey rsa:2048: 生成一个新的 2048 位 RSA 私钥。
* -keyout private.key: 指定私钥输出文件名为 private.key。
* -out certificate.crt: 指定证书输出文件名为 certificate.crt。
* -days 365: 设置证书的有效期为 365 天。
* -nodes: 不加密私钥。
5.2 通过 CSR 生成自签名证书
如果您已经有了私钥和 CSR 文件,可以使用此方法生成自签名证书。
bash
openssl x509 -req -in server.csr -signkey private.key -out server.crt -days 365
* -req: 表明输入是 CSR 文件。
* -in server.csr: 指定输入的 CSR 文件。
* -signkey private.key: 使用指定的私钥对证书进行签名。
* -out server.crt: 指定输出的证书文件。
* -days 365: 设置证书的有效期为 365 天。
6. 搭建简易证书颁发机构 (CA)
搭建自己的 CA 允许您签发和管理内部信任的证书。这对于企业内部网络、VPN 或测试环境非常有用,因为您可以控制信任链,无需依赖外部商业 CA。
6.1 生成 CA 私钥和自签名证书
首先,为您的 CA 创建一个私钥和自签名根证书。CA 私钥是整个信任链的根基,务必使用强密码加密并妥善保管。
-
生成 CA 私钥 (带密码):
bash
openssl genrsa -aes256 -out ca.key 4096
建议为 CA 私钥设置一个强大的密码。 -
生成 CA 根证书:
bash
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt-x509: 生成自签名证书。-new: 创建新请求。-nodes: 如果您的ca.key已经加密,这里会提示输入密码。如果ca.key不加密,则无需此选项。-key ca.key: 指定 CA 私钥。-sha256: 使用 SHA256 算法签名。-days 3650: 设置 CA 根证书的有效期为 10 年 (3650 天),通常 CA 证书有效期较长。-out ca.crt: 指定输出的 CA 根证书文件。
在提示时,Common Name应填写您的 CA 名称,例如My Internal Root CA。
6.2 CA 目录结构 (推荐)
为了更好地管理 CA 签发的证书,建议设置一个规范的目录结构和配置文件。
bash
mkdir myca
cd myca
mkdir certs crl newcerts private
chmod 700 private # 严格限制私钥目录权限
touch index.txt
echo 1000 > serial
* certs: 存放已签发的证书。
* crl: 存放证书吊销列表。
* newcerts: 存放新签发的证书。
* private: 存放 CA 私钥,权限应严格限制,确保只有 CA 管理员可以访问。
* index.txt: CA 维护的证书数据库文件。
* serial: 记录下一个证书的序列号,确保每个签发证书的序列号唯一。
7. 使用 CA 签发证书
有了 CA 之后,您就可以使用它来签发其他服务器或客户端证书。这些证书将由您的 CA 信任,因此在配置了 CA 根证书的系统上会被认为是有效的。
-
为服务器/客户端生成私钥和 CSR:
首先,为您的服务器或客户端生成一个新的私钥和对应的 CSR。“`bash
生成服务器私钥
openssl genrsa -out server.key 2048
生成服务器 CSR
openssl req -new -key server.key -out server.csr
``Common Name
在生成 CSR 时,应填写服务器的域名 (例如www.example.com`) 或客户端的唯一标识。 -
使用 CA 签发服务器/客户端证书:
将生成的 CSR 提交给您的 CA 进行签名。bash
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256
*-in server.csr: 指定要签名的 CSR 文件。
*-CA ca.crt: 指定 CA 根证书。
*-CAkey ca.key: 指定 CA 私钥。
*-CAcreateserial: 自动创建并管理证书序列号文件 (serial)。
*-out server.crt: 指定输出的签发证书文件。
*-days 365: 设置证书有效期为 365 天。
*-sha256: 使用 SHA256 算法签名。注意: 如果您的 CA 私钥设置了密码,在执行此命令时会提示您输入密码。
7.1 证书扩展 (SAN)
现代浏览器和应用程序通常要求证书包含 Subject Alternative Name (SAN) 扩展,以支持一个证书涵盖多个域名、子域名或 IP 地址。您可以通过创建 OpenSSL 配置文件来实现。
-
创建
san.cnf文件:
创建一个文本文件,例如san.cnf,内容如下:“`ini
[ req ]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no # 禁用交互式提示[ req_distinguished_name ]
countryName = CN
stateOrProvinceName = Guangdong
localityName = Shenzhen
organizationName = MyOrg
commonName = www.example.com # 主要域名[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names[ alt_names ]
DNS.1 = www.example.com
DNS.2 = example.com
DNS.3 = sub.example.com
IP.1 = 192.168.1.100
``[ alt_names ]
* 在部分,您可以添加DNS.条目用于域名,IP.` 条目用于 IP 地址。 -
使用配置文件生成 CSR:
bash
openssl req -new -key server.key -sha256 -out server_san.csr -config san.cnf -
使用 CA 签发包含 SAN 的证书:
bash
openssl x509 -req -in server_san.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server_san.crt -days 365 -sha256 -extfile san.cnf -extensions v3_req-extfile san.cnf: 指定包含扩展信息的配置文件。-extensions v3_req: 指定使用配置文件中的v3_req节作为扩展。
8. 证书格式与转换
证书和密钥存在多种格式,OpenSSL 提供了强大的转换功能,以适应不同的应用程序和系统需求。
- PEM (Privacy Enhanced Mail): 最常见的格式,Base64 编码,通常以
-----BEGIN...-----和-----END...-----这样的文本标记开始和结束。文件扩展名通常为.pem,.crt,.cer,.key。 - DER (Distinguished Encoding Rules): 二进制格式,通常用于 Java 应用程序。文件扩展名通常为
.der,.cer。 - PKCS#12 (PFX/P12): 一种二进制格式,通常包含私钥和证书链,并受密码保护。常用于 Windows 系统。文件扩展名通常为
.pfx,.p12。
8.1 常见格式转换命令
-
PEM 证书转换为 DER 格式:
bash
openssl x509 -outform der -in certificate.pem -out certificate.der -
DER 证书转换为 PEM 格式:
bash
openssl x509 -inform der -in certificate.der -out certificate.pem -
PEM 证书和私钥转换为 PKCS#12 (PFX/P12) 格式:
bash
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in certificate.crt -certfile ca.crt -name "My Server Certificate"
此命令会提示您设置一个导出密码。-certfile ca.crt用于包含 CA 证书,构建完整的证书链。 -
PKCS#12 (PFX/P12) 转换为 PEM (提取证书和私钥):
bash
openssl pkcs12 -in certificate.pfx -out certificate.pem -nodes
-nodes选项表示不加密输出的私钥。如果需要单独提取私钥和证书:
bash
# 提取私钥
openssl pkcs12 -in certificate.pfx -nocerts -out private.key -nodes
# 提取证书
openssl pkcs12 -in certificate.pfx -nokeys -out certificate.crt
9. 证书验证
验证证书是确保其有效性、信任链完整性和私钥匹配的重要步骤。
9.1 查看证书内容
bash
openssl x509 -in certificate.crt -text -noout
* -in certificate.crt: 指定要查看的证书文件。
* -text: 以文本形式显示证书的详细内容,包括颁发者、有效期、公钥、扩展等。
* -noout: 不输出证书的编码版本,只显示文本信息。
9.2 验证 CSR 内容
bash
openssl req -in server.csr -text -noout
9.3 验证私钥
检查私钥文件是否有效。如果私钥受密码保护,会提示输入密码。
“`bash
openssl rsa -in private.key -check
对于 ECC 私钥
openssl ec -in ec_private.key -check
“`
9.4 验证证书链
验证证书是否由受信任的 CA 签发,并且证书链完整。
bash
openssl verify -CAfile ca.crt server.crt
* -CAfile ca.crt: 指定信任的根 CA 证书文件。
* server.crt: 指定要验证的服务器证书。
如果证书链包含中间 CA,您可能需要将所有中间 CA 证书合并到一个文件中,或者使用 -untrusted 选项指定中间证书。
“`bash
验证包含中间证书的链
openssl verify -CAfile ca.crt -untrusted intermediate.crt server.crt
“`
9.5 验证证书和私钥是否匹配
确保证书与私钥是配对的。
“`bash
查看证书的 modulus
openssl x509 -noout -modulus -in certificate.crt | openssl md5
查看私钥的 modulus
openssl rsa -noout -modulus -in private.key | openssl md5
两个 MD5 值应该相同
“`
10. 总结与最佳实践
- 私钥安全: 私钥是您数字身份的关键。始终保护好您的私钥,特别是 CA 私钥。建议使用密码加密私钥,并将其存储在高度安全的位置,限制访问权限。
- 密钥长度: 对于 RSA 密钥,推荐使用 2048 位或 4096 位。对于 ECC 密钥,建议使用
prime256v1或更强的曲线。 - 证书有效期: 根据实际需求设置合理的有效期。CA 根证书可以设置较长的有效期 (例如 10 年),而服务器/客户端证书通常为 1-2 年。
- Common Name (CN): 对于服务器证书,CN 必须与域名完全匹配,否则浏览器会警告。
- SAN 扩展: 现代证书应包含 SAN (Subject Alternative Name) 扩展,以支持一个证书涵盖多个域名、子域名或 IP 地址,这是最佳实践。
- 备份: 务必妥善备份所有私钥和证书文件,特别是 CA 相关的私钥和证书,并存储在安全离线的位置。
- 版本: 确保您的 OpenSSL 版本是最新的,以获得最新的安全特性和算法支持。
- 配置文件: 对于复杂的证书生成和管理,善用 OpenSSL 配置文件 (
.cnf) 可以提高效率和减少错误。
通过遵循本攻略,您将能够熟练使用 OpenSSL 生成、管理和验证各种类型的证书,从而增强您的网络通信安全。