3. OpenSSL 入门:从安装到实战
说实话,我见过不少搞安全的同行,证书出了问题第一反应就是去翻 GUI 工具。但真正到了生产环境,你大概率只能面对一个黑乎乎的终端。OpenSSL 就是那个你绕不开的瑞士军刀。这一章,我带你把它的底裤扒清楚。
3.1 OpenSSL 是什么?为什么必须学它?
OpenSSL 是一个开源的加密库,也是命令行工具。它实现了 SSL/TLS 协议,支持各种加密算法、证书操作。说白了,你平时看到的 .crt、.key、.pem、.p12 文件,十有八九都是它生成的。
我个人的习惯是:不管项目用的是什么语言、什么框架,底层证书操作一律用 OpenSSL 命令行搞定。为什么?因为它稳定、透明、不受上层库版本影响。你想想看,Java 的 KeyStore 换个版本可能就不兼容了,但 OpenSSL 生成的 PEM 文件,二十年前能用,二十年后照样能读。
核心认知:OpenSSL 不是「一个工具」,而是「证书生命周期管理的基石」。从密钥生成、CSR 创建、证书签发,到格式转换、证书验证、吊销检查,全都能用它完成。
3.2 安装 OpenSSL
不同系统安装方式略有差异,但核心都一样。我列一下最常见的几种:
| 操作系统 | 安装命令 | 备注 |
|---|---|---|
| Ubuntu/Debian | sudo apt install openssl |
一般系统自带 |
| CentOS/RHEL | sudo yum install openssl |
也可能用 dnf |
| macOS | brew install openssl |
系统自带版本较老 |
| Windows | 下载安装包或 WSL | 建议用 WSL 环境 |
装完之后,跑一下 openssl version 确认版本。我建议至少用 1.1.1 以上版本,1.0.2 已经停止维护了,别踩这个坑。
小技巧:如果你在容器里工作,直接用 docker run -it --rm alpine:latest sh -c "apk add openssl && openssl version",秒级获得一个干净的 OpenSSL 环境。
3.3 常用命令概览
OpenSSL 命令多到让人头皮发麻。但别慌,日常工作中你真正高频使用的,其实不超过十个。我按使用频率给你排个序:
- genrsa / genpkey — 生成 RSA 或 ECC 私钥
- req — 生成 CSR 或自签名证书
- x509 — 查看证书内容、签发证书
- pkcs12 — 处理 .p12/.pfx 格式
- verify — 验证证书链
- s_client — 测试 TLS 连接
- dgst — 计算哈希值
- enc — 加解密文件
嗯,这里要注意:很多人一上来就背命令参数,其实没必要。你只要记住「我想干什么 → 对应哪个子命令 → 查参数」这个链路就够了。我做了这么多年,也经常 man openssl 或者 openssl help。
3.4 生成 RSA 密钥对
RSA 是目前最通用的非对称加密算法。生成密钥对是证书生命周期第一步,也是最基础的一步。
我个人习惯用 genpkey 而不是老式的 genrsa,因为前者更统一,支持更多算法。但为了兼容老系统,我两种都给你演示:
方式一:传统 genrsa(推荐 2048 位以上)
# 生成 2048 位 RSA 私钥
openssl genrsa -out server.key 2048
# 从私钥提取公钥
openssl rsa -in server.key -pubout -out server.pub
方式二:现代 genpkey(更灵活)
# 生成 RSA 私钥,使用 AES-256 加密保护
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 \
-aes-256-cbc -out server-enc.key
# 查看私钥信息
openssl pkey -in server-enc.key -text -noout
避坑指南:我曾经在生产环境遇到过一个问题——某同事生成的私钥没有加密,结果 CI/CD 脚本里明文传参,密钥直接暴露在日志里。记住:私钥文件必须设置文件权限 600,且建议加密存储。生成时加上 -aes-256-cbc 参数,虽然每次使用要输密码,但安全等级完全不一样。
3.5 生成 ECC 密钥对
ECC(椭圆曲线密码学)正在快速取代 RSA。它用更短的密钥长度提供同等安全强度。比如 256 位的 ECC 密钥,安全性和 3072 位的 RSA 差不多。
ECC 的关键是选对曲线。目前主流是 prime256v1(也叫 secp256r1)和 secp384r1。我建议新项目直接用 secp384r1,兼容性和安全性都够用。
# 生成 ECC 私钥(prime256v1 曲线)
openssl ecparam -genkey -name prime256v1 -out ecc.key
# 查看曲线列表
openssl ecparam -list_curves
# 从私钥提取公钥
openssl ec -in ecc.key -pubout -out ecc.pub
# 查看密钥详情
openssl ec -in ecc.key -text -noout
你可能会问:RSA 和 ECC 到底选哪个?我的建议是:
- 兼容性优先(比如对接老旧系统)→ 选 RSA 2048
- 性能优先(比如 IoT、移动端)→ 选 ECC P-256 或 P-384
- 未来导向(新项目)→ 直接上 ECC P-384
3.6 查看证书内容
拿到一个证书文件,第一件事就是看它里面到底写了什么。我见过太多人直接把证书当黑盒用,出了问题才去查。其实一行命令就能看得清清楚楚。
# 查看 PEM 格式证书
openssl x509 -in certificate.crt -text -noout
# 查看 DER 格式证书(先转码)
openssl x509 -in certificate.der -inform DER -text -noout
# 只查看证书有效期
openssl x509 -in certificate.crt -dates -noout
# 只查看主题和颁发者
openssl x509 -in certificate.crt -subject -issuer -noout
输出内容里,你重点看这几个字段:
| 字段 | 含义 | 常见问题 |
|---|---|---|
| Subject | 证书持有者信息 | CN 是否匹配域名 |
| Issuer | 签发者信息 | 是否来自可信 CA |
| Not Before / Not After | 有效期起止时间 | 证书是否已过期 |
| Subject Public Key Info | 公钥算法和长度 | 是否满足安全要求 |
| X509v3 extensions | 扩展属性 | 是否包含 SAN、Key Usage |
实战技巧:我排查证书问题时,最常用的组合是 openssl x509 -in cert.crt -text -noout | grep -E "Subject:|Issuer:|Not Before|Not After|DNS:",一眼扫完关键信息,比翻 GUI 快十倍。
3.7 本章知识体系总览
为了让你对本章内容有个整体印象,我画了一张结构图。它把 OpenSSL 入门需要掌握的核心模块串了起来:
这张图把本章的四个核心模块串在了一起。你顺着箭头走一遍:先搞定安装,再生成密钥对,然后熟悉常用命令,最后学会查看证书内容。每一步都是下一步的前提。