4. OpenSSL 入门:从工具到实战
说到证书配置,OpenSSL 是绕不开的工具。我最早接触它是在一次线上 HTTPS 证书紧急更换中——那时候手忙脚乱,连基本命令都记不全。后来才发现,这东西其实没那么复杂。说白了,它就是一套加密工具集,能帮你生成密钥、签发证书、做各种加解密操作。
这一节,我们把它拆开揉碎,从安装到常用命令,一次讲清楚。
4.1 OpenSSL 是什么?
OpenSSL 是一个开源的加密库和命令行工具。它实现了 SSL/TLS 协议,支持各种对称加密、非对称加密、哈希算法。你平时看到的 .key、.crt、.csr、.pem 文件,基本都是它生成的。
它的核心组件就两个:
- libcrypto:加密算法库,负责加解密、哈希、签名等底层操作。
- libssl:SSL/TLS 协议实现,负责握手、会话管理等上层逻辑。
命令行工具 openssl 把这两部分封装成一个个子命令,方便我们直接调用。
一句话总结:OpenSSL = 加密算法库 + SSL/TLS 协议 + 命令行工具。你不需要懂底层数学,会用命令就行。
4.2 安装与编译:选对版本很重要
安装 OpenSSL 的方式有好几种。我个人习惯用包管理器,省事。但如果你需要定制功能或追求性能,就得自己编译。
4.2.1 包管理器安装(推荐)
这是最快的方式。不同系统命令如下:
| 操作系统 | 安装命令 | 默认路径 |
|---|---|---|
| Ubuntu/Debian | sudo apt install openssl libssl-dev |
/usr/bin/openssl |
| CentOS/RHEL 7 | sudo yum install openssl openssl-devel |
/usr/bin/openssl |
| CentOS/RHEL 8+ | sudo dnf install openssl openssl-devel |
/usr/bin/openssl |
| macOS | brew install openssl |
/usr/local/opt/openssl |
小提示:macOS 自带的 OpenSSL 版本很老(LibreSSL 分支),建议用 Homebrew 装一份新的。装完后记得把路径加到 PATH 里。
4.2.2 源码编译安装
什么时候需要自己编译?我遇到过两种情况:一是系统自带的版本太老,不支持某些新特性(比如 TLS 1.3);二是需要启用特定算法或优化选项。
编译步骤其实很固定:
# 1. 下载源码(以 3.0.14 为例)
wget https://www.openssl.org/source/openssl-3.0.14.tar.gz
tar -xzf openssl-3.0.14.tar.gz
cd openssl-3.0.14
# 2. 配置(指定安装路径)
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
# 3. 编译 & 安装
make -j$(nproc)
sudo make install
# 4. 验证
/usr/local/openssl/bin/openssl version
这里有个坑:编译完别忘了把动态库路径加到系统缓存里。我曾经因为忘了这步,导致其他程序链接不到新版本的 libssl,排查了半天。
# 添加库路径
echo "/usr/local/openssl/lib64" | sudo tee /etc/ld.so.conf.d/openssl.conf
sudo ldconfig
注意:不要覆盖系统自带的 OpenSSL!系统工具(如 ssh、wget)可能依赖旧版本。建议安装到独立目录,用软链接或环境变量切换。
4.3 版本选择建议
OpenSSL 的版本号有规律。目前主流是 1.1.1 和 3.x 系列。我建议你按场景选:
| 版本 | 状态 | 适用场景 | 我的建议 |
|---|---|---|---|
| 1.1.1 | 2023年9月停止支持 | 老旧系统、兼容性要求高 | 尽量迁移,别再用 |
| 3.0 LTS | 长期支持(至2026年) | 生产环境首选 | 推荐使用 |
| 3.1 / 3.2 | 标准版本 | 需要新特性(如 QUIC) | 测试环境可用 |
| 3.3+ | 最新开发版 | 尝鲜、开发测试 | 别上生产 |
为什么推荐 3.0 LTS?因为它有 5 年支持周期,而且引入了不少改进:
- 代码架构重构,更安全
- 默认启用 TLS 1.3
- 新的 FIPS 模块
- API 更清晰(虽然不兼容 1.x)
我的选择:新项目一律用 3.0 LTS。老项目如果还在用 1.1.1,尽快安排升级。别等到 CVE 爆出来再慌。
4.4 常用命令概览
OpenSSL 的命令很多,但日常用的就那几个。我按使用频率排了个序:
4.4.1 查看版本和帮助
# 查看版本
openssl version
# 查看所有子命令
openssl help
# 查看某个子命令的帮助
openssl genrsa -help
4.4.2 生成密钥对
这是最常用的操作。RSA 和 ECDSA 是两种主流算法:
# 生成 RSA 私钥(2048位)
openssl genrsa -out private.key 2048
# 从私钥提取公钥
openssl rsa -in private.key -pubout -out public.key
# 生成 ECDSA 私钥(P-256 曲线)
openssl ecparam -genkey -name prime256v1 -out ecdsa.key
# 查看私钥内容
openssl rsa -in private.key -text -noout
经验之谈:RSA 2048 位是目前最通用的选择。ECDSA 密钥更小、性能更好,但兼容性稍差。如果你面向的是现代浏览器和系统,优先用 ECDSA。
4.4.3 生成证书签名请求(CSR)
CSR 是申请证书的中间文件。你需要提供域名和组织信息:
# 交互式生成 CSR
openssl req -new -key private.key -out server.csr
# 非交互式(一次性指定所有信息)
openssl req -new -key private.key -out server.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=IT/CN=www.example.com"
这里有个常见问题:Common Name (CN) 必须填域名。我见过有人填了公司名,结果证书签发后浏览器报域名不匹配。
4.4.4 自签名证书
测试环境用自签名证书就够了。一条命令搞定:
# 生成自签名证书(有效期365天)
openssl req -x509 -newkey rsa:2048 -keyout private.key \
-out certificate.crt -days 365 -nodes \
-subj "/CN=localhost"
-nodes 表示不加密私钥,测试时方便。生产环境千万别加这个参数。
4.4.5 查看证书信息
拿到一个证书,怎么知道它里面有什么?用这个命令:
# 查看 PEM 格式证书
openssl x509 -in certificate.crt -text -noout
# 查看 DER 格式证书(先转换)
openssl x509 -in certificate.der -inform der -text -noout
输出内容很多,重点关注:Issuer(签发者)、Subject(主体)、Validity(有效期)、Subject Public Key Info(公钥算法和长度)。
4.4.6 格式转换
不同平台对证书格式要求不一样。OpenSSL 可以轻松转换:
# PEM → DER
openssl x509 -in cert.pem -outform der -out cert.der
# DER → PEM
openssl x509 -in cert.der -inform der -out cert.pem
# PEM → PKCS#12(含私钥)
openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.p12
# PKCS#12 → PEM(提取私钥和证书)
openssl pkcs12 -in cert.p12 -nocerts -out key.pem
openssl pkcs12 -in cert.p12 -clcerts -nokeys -out cert.pem
注意:PKCS#12 文件通常有密码保护。转换时如果提示输入密码,默认密码可能是空或 "changeit"。如果忘了密码,这个文件基本就废了。
4.5 知识体系总览
下面这张图把 OpenSSL 的核心功能串起来了。你可以把它当作一个快速索引:
4.6 避坑指南
最后分享几个我踩过的坑:
- 别用 MD5 或 SHA-1:这两个算法已经不安全了。生成证书时默认用 SHA-256,别手贱去改。
- 私钥权限要设对:
chmod 600 private.key。我见过有人把私钥设成 644,结果被同事误删了。 - 注意 OpenSSL 版本差异:1.x 和 3.x 的某些命令参数不一样。比如
openssl genrsa在 3.x 里还能用,但官方更推荐openssl genpkey。 - 不要在生产环境用自签名证书:测试可以,线上必须用受信任的 CA 签发的证书。否则用户访问时会看到安全警告。
嗯,OpenSSL 入门就这些。工具本身不复杂,关键是理解它背后的逻辑——密钥、证书、格式、协议。把这些概念理清了,后面配置 HTTPS、做双向认证、搭建 CA 都会顺很多。