4. OpenSSL 工具链:安装、配置与自签名根证书

OpenSSL 这东西,可以说是 PKI 世界的瑞士军刀。我做了这么多年安全架构,几乎每个项目都离不开它。别看它命令行参数又多又长,其实核心套路就那么几条。今天咱们就把 OpenSSL 的安装、配置和生成自签名根证书这件事,一次讲透。

4.1 OpenSSL 的安装与基础配置

不同操作系统下安装方式不太一样,我列个表给你参考:

操作系统 安装方式 配置文件路径
Ubuntu/Debian apt install openssl /etc/ssl/openssl.cnf
CentOS/RHEL yum install openssl /etc/pki/tls/openssl.cnf
macOS (Homebrew) brew install openssl /usr/local/etc/openssl@3/openssl.cnf
Windows 下载安装包或 WSL 安装目录下的 openssl.cnf

装完之后,先确认版本:

openssl version
# 输出示例:OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
我的习惯: 我一般会在项目根目录下放一份自定义的 openssl.cnf,而不是直接改系统级的配置。这样每个项目独立,不会互相干扰。

4.2 核心配置文件解析

OpenSSL 的配置文件,说白了就是告诉它「证书该怎么生成、信息该怎么填」。我见过不少新手直接跳过配置,结果生成的证书各种问题。嗯,这里咱们花几分钟把关键字段搞清楚。

一个典型的配置文件长这样:

[ req ]
default_bits        = 4096
default_keyfile     = ca-key.pem
distinguished_name  = req_distinguished_name
x509_extensions     = v3_ca
prompt              = no

[ req_distinguished_name ]
countryName             = CN
stateOrProvinceName     = Beijing
localityName            = Beijing
organizationName        = MyCompany
organizationalUnitName  = PKI
commonName              = MyCompany Root CA

[ v3_ca ]
basicConstraints       = critical, CA:TRUE
keyUsage               = critical, keyCertSign, cRLSign
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer

这里有几个关键点:

  • default_bits:密钥长度,企业环境我建议至少 4096 位。2048 虽然还能用,但说实话已经有点不够看了。
  • basicConstraints:标记这是 CA 证书,CA:TRUE 不能少。
  • keyUsage:根证书只需要 keyCertSign 和 cRLSign,别乱加。
我曾经踩过的坑: 有一次我忘了加 critical 标记,结果某些老旧设备直接不认这个证书。从那以后,CA 相关的扩展我必加 critical。

4.3 常用命令速查

OpenSSL 命令多,但常用的其实就十几个。我按使用频率给你排个序:

命令 用途 示例
genrsa 生成 RSA 私钥 openssl genrsa -out key.pem 4096
req 生成 CSR 或自签名证书 openssl req -new -key key.pem -out csr.pem
x509 证书签发、查看、转换 openssl x509 -in cert.pem -text -noout
rsa RSA 密钥管理 openssl rsa -in key.pem -pubout
verify 验证证书链 openssl verify -CAfile ca.pem cert.pem
pkcs12 PKCS#12 格式转换 openssl pkcs12 -export -out bundle.p12

你想想看,这些命令其实就覆盖了「生成密钥 → 生成请求 → 签发证书 → 查看验证 → 格式转换」这条完整链路。记住这个链路,比死记命令参数管用多了。

4.4 生成自签名根证书(完整流程)

好,咱们动手实操。生成自签名根证书,我习惯分三步走:

第一步:生成根 CA 私钥

openssl genrsa -out root-ca-key.pem 4096

这条命令会生成一个 4096 位的 RSA 私钥。我个人习惯把私钥权限设成 400,只读不写:

chmod 400 root-ca-key.pem
安全提示: 根 CA 私钥是整条 PKI 链的命根子。我在生产环境里,会把根私钥放在离线机器上,甚至用硬件安全模块(HSM)来存储。平时开发测试可以放本地,但千万别传到 Git 仓库里。

第二步:生成自签名根证书

openssl req -x509 -new \
  -key root-ca-key.pem \
  -out root-ca-cert.pem \
  -days 3650 \
  -config openssl.cnf

这里 -days 3650 是有效期 10 年。根证书有效期一般设 10-20 年,因为换根证书的成本很高——所有下级证书和信任锚点都得更新。

第三步:验证根证书

openssl x509 -in root-ca-cert.pem -text -noout | head -20

你会看到类似这样的输出:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: ...
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = MyCompany Root CA
        Validity
            Not Before: ...
            Not After : ...
        Subject: CN = MyCompany Root CA
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE

看到 CA:TRUE 了吗?这就是根证书的身份证。

4.5 知识体系总览

我把这一章的核心逻辑画了张图,方便你理解:

OpenSSL 工具链核心流程 安装与配置 openssl.cnf 定制 生成私钥 genrsa / ecparam 自签名证书 req -x509 常用命令 genrsa / req / x509 rsa / verify / pkcs12 ca / crl / ocsp 验证与调试 x509 -text -noout verify -CAfile s_client -connect 输出产物 root-ca-key.pem root-ca-cert.pem openssl.cnf 💡 核心原则 私钥安全 > 证书有效期 > 扩展字段完整性 根证书一旦签发,私钥必须离线保管

4.6 避坑指南与最佳实践

最后,我把自己这些年踩过的坑总结一下:

  • 私钥权限:根 CA 私钥必须 chmod 400,甚至可以考虑加密存储。我曾经见过有人把私钥设成 644,结果被同事误删了。
  • 证书序列号:自签名根证书的序列号可以手动指定,但建议用随机数。我习惯用 -set_serial 0x$(openssl rand -hex 16) 来生成。
  • 有效期规划:根证书 10 年,中间 CA 5 年,终端证书 1-2 年。别把根证书有效期设太短,否则后面所有证书都得重签。
  • 配置文件备份:openssl.cnf 一定要和证书一起备份。我遇到过配置文件丢了,后面想续签证书时发现参数对不上的尴尬情况。

本章核心产出:

  • 一个 4096 位的 RSA 私钥:root-ca-key.pem
  • 一个自签名根证书:root-ca-cert.pem
  • 一份可复用的配置文件:openssl.cnf

这三个文件,就是你整个 PKI 体系的基石。保管好它们,后面的章节才能顺利展开。