OpenSSL证书生成全攻略 – wiki词典


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 openssl

    CentOS/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.comapi.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 私钥是整个信任链的根基,务必使用强密码加密并妥善保管。

  1. 生成 CA 私钥 (带密码):
    bash
    openssl genrsa -aes256 -out ca.key 4096

    建议为 CA 私钥设置一个强大的密码。

  2. 生成 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 根证书的系统上会被认为是有效的。

  1. 为服务器/客户端生成私钥和 CSR:
    首先,为您的服务器或客户端生成一个新的私钥和对应的 CSR。

    “`bash

    生成服务器私钥

    openssl genrsa -out server.key 2048

    生成服务器 CSR

    openssl req -new -key server.key -out server.csr
    ``
    在生成 CSR 时,
    Common Name应填写服务器的域名 (例如www.example.com`) 或客户端的唯一标识。

  2. 使用 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 配置文件来实现。

  1. 创建 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 地址。

  2. 使用配置文件生成 CSR:
    bash
    openssl req -new -key server.key -sha256 -out server_san.csr -config san.cnf

  3. 使用 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 生成、管理和验证各种类型的证书,从而增强您的网络通信安全。


滚动至顶部