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
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。我画了张图,帮你理清关系:
2.5 本章小结
这一章我们干了三件事:装好 OpenSSL、记住几个核心命令、亲手建了一个根 CA。你手里现在应该有 rootCA.key 和 rootCA.crt 两个文件——别小看它们,后面所有证书签发都靠这个根。
最后啰嗦一句:根 CA 的私钥一定要备份,而且备份要离线。我见过硬盘坏了根 CA 私钥丢了的案例,那真是欲哭无泪。嗯,你懂的。