2、OpenSSL入门:安装、编译与自签名根CA

说实话,很多搞证书的同学一开始都绕不开 OpenSSL。它就像瑞士军刀——功能全,但上手有点糙。我最早接触它是在一个内部 CA 迁移项目里,那时候被各种参数搞得头大。后来用顺手了,才发现这东西是真香。

这一章,咱们就把 OpenSSL 的安装、常用命令和自签名根 CA 一次性讲透。你跟着走一遍,后面批量管理证书就顺了。

2.1 安装与编译:别小看这一步

OpenSSL 的安装方式主要分两种:包管理器安装和源码编译。我个人习惯是,生产环境尽量用包管理器,省心;但如果你需要定制算法或打补丁,那就得走编译。

2.1.1 包管理器安装(推荐)

不同系统命令不一样,我列个表,你对着来就行:

操作系统 安装命令 备注
Ubuntu/Debian sudo apt install openssl libssl-dev 开发库也要装
CentOS/RHEL 7 sudo yum install openssl openssl-devel 老版本注意升级
CentOS/RHEL 8+ sudo dnf install openssl openssl-devel 默认 1.1.1 以上
macOS brew install openssl 记得加 PATH
小提示:装完后跑一下 openssl version,确认版本。我遇到过几次系统自带的老版本 OpenSSL,导致 ECDSA 签名失败。嗯,版本这事,越新越稳。

2.1.2 源码编译(进阶)

什么时候需要编译?举个例子,我曾经有个项目要求必须用国密 SM2/SM3/SM4,但系统自带的 OpenSSL 1.0.2 不支持。没办法,只能从源码编译,带上国密补丁。

编译步骤其实不复杂:

# 1. 下载源码(以 1.1.1w 为例)
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar -xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w

# 2. 配置(指定安装路径)
./config --prefix=/usr/local/openssl \
         --openssldir=/usr/local/openssl/ssl \
         shared

# 3. 编译 & 安装
make -j$(nproc)
sudo make install

# 4. 更新动态库链接
echo "/usr/local/openssl/lib" | sudo tee /etc/ld.so.conf.d/openssl.conf
sudo ldconfig

# 5. 设置 PATH(加到 ~/.bashrc 或 ~/.zshrc)
export PATH=/usr/local/openssl/bin:$PATH
注意:编译时如果报 Perl 找不到,先装一下 perl。还有,make test 建议跑一遍,我遇到过编译成功但测试挂掉的情况——多半是依赖库版本冲突。

2.2 常用命令概览:先记住这几个

OpenSSL 命令多到能写本书,但日常证书管理常用的就那么几个。我按使用频率排了个序:

命令 用途 典型场景
req 生成 CSR 和自签名证书 创建根 CA、申请证书
x509 查看/转换证书信息 检查证书有效期、格式转换
rsa / ec 管理 RSA/ECC 私钥 生成密钥、查看密钥详情
ca CA 签发证书 用根 CA 签发子证书
verify 验证证书链 检查证书是否可信
pkcs12 PKCS#12 格式转换 导出为 .p12 用于浏览器

你想想看,这些命令其实就覆盖了证书的“生、查、签、验、转”五个环节。后面章节我们会逐个深入,但今天先动手把根 CA 建起来。

2.3 生成自签名根 CA:从零到一

自签名根 CA 是啥?说白了,就是你自己当“发证机关”。虽然浏览器不认它,但在内网环境、开发测试、设备证书场景下,它比买证书灵活得多。

我当年给公司搭内部 CA 时,第一件事就是生成根 CA。步骤其实就三步:

2.3.1 生成根 CA 私钥

私钥是根 CA 的命根子。丢了,所有签发的证书都得作废。所以我建议用 4096 位 RSA,或者 ECC P-384:

# 生成 RSA 4096 位私钥
openssl genrsa -out rootCA.key 4096

# 或者用 ECC P-384(更安全,性能更好)
openssl ecparam -genkey -name secp384r1 -out rootCA.key
关键点:私钥文件权限一定要设为 600。我见过有人把私钥设成 644,结果被同事误拷贝走了……嗯,那场面挺尴尬的。

2.3.2 生成根 CA 证书(自签名)

有了私钥,就可以用 req 命令生成自签名证书了。这里参数比较多,我拆开讲:

openssl req -x509 \
  -new \
  -nodes \
  -key rootCA.key \
  -sha256 \
  -days 3650 \
  -out rootCA.crt \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=MyRootCA" \
  -addext "basicConstraints=critical,CA:TRUE" \
  -addext "keyUsage=critical,keyCertSign,cRLSign"

参数说明:

  • -x509:直接输出自签名证书,不走 CSR 流程
  • -nodes:不加密私钥(方便自动化,但要注意安全)
  • -sha256:签名哈希算法,别用 SHA1,那玩意儿已经过时了
  • -days 3650:有效期 10 年,根 CA 一般设长点
  • -addext:添加扩展属性,CA:TRUE 表示这是个 CA 证书
避坑指南:我曾经漏加了 basicConstraints=CA:TRUE,结果用这个根 CA 去签发子证书时,OpenSSL 直接报错。记住,根证书必须标记为 CA,否则它就是个普通证书,不能签发。

2.3.3 验证根 CA

证书生成后,别急着用。先验证一下:

# 查看证书内容
openssl x509 -in rootCA.crt -text -noout

# 验证自签名(自己验证自己)
openssl verify -CAfile rootCA.crt rootCA.crt

如果输出 rootCA.crt: OK,说明根 CA 没问题。你可以重点关注 Subject、Issuer(自签名时两者相同)、Not Before 和 Not After 这几个字段。

2.4 知识体系总览

这一章的内容其实就围绕一个核心流程:安装 → 命令 → 建 CA。我画了张图,帮你理清关系:

OpenSSL 入门知识结构 安装与编译 常用命令概览 自签名根 CA 包管理器安装 源码编译 req / x509 ca / verify 生成私钥 自签名 输出:rootCA.key + rootCA.crt 核心要点 • 根 CA 私钥必须严格保护(权限 600,离线存储) • 自签名证书需显式添加 CA:TRUE 扩展 • 验证环节不可跳过,确保证书链完整

2.5 本章小结

这一章我们干了三件事:装好 OpenSSL、记住几个核心命令、亲手建了一个根 CA。你手里现在应该有 rootCA.key 和 rootCA.crt 两个文件——别小看它们,后面所有证书签发都靠这个根。

最后啰嗦一句:根 CA 的私钥一定要备份,而且备份要离线。我见过硬盘坏了根 CA 私钥丢了的案例,那真是欲哭无泪。嗯,你懂的。