4. OpenSSL 工具入门:安装、常用命令与密钥对生成
说实话,搞证书链和接口安全,OpenSSL 是绕不过去的家伙。我见过不少开发同学,一提到 OpenSSL 就头疼,觉得命令行太复杂。其实你把它当成一把瑞士军刀就好——常用的就那么几招,练熟了就行。
这一章,我带你把 OpenSSL 装好,把最常用的命令过一遍,然后亲手生成 RSA 和 ECC 两套密钥对。嗯,这些都是后面实战的基础。
4.1 OpenSSL 安装:不同平台怎么搞
OpenSSL 几乎在所有主流系统上都能跑。我个人的习惯是,能装最新稳定版就别用系统自带的旧版,尤其是 macOS 和 Windows,坑不少。
| 操作系统 | 安装方式 | 备注 |
|---|---|---|
| Linux (Ubuntu/Debian) | sudo apt install openssl |
通常已预装,版本可能偏旧 |
| Linux (CentOS/RHEL) | sudo yum install openssl |
同上,建议用 EPEL 源更新 |
| macOS | brew install openssl |
系统自带 LibreSSL,别用那个 |
| Windows | 下载安装包或使用 WSL | 推荐用 WSL,省心很多 |
openssl 命令,那是 LibreSSL,很多参数不兼容。用 Homebrew 装完后,记得把路径加到 ~/.zshrc 里。
装完之后,验证一下版本:
openssl version
你应该会看到类似 OpenSSL 3.0.12 的输出。如果版本号低于 1.1.1,我建议你升级一下,因为旧版不支持 TLS 1.3 和一些新特性。
4.2 常用命令概览:先混个脸熟
OpenSSL 的命令很多,但日常用得上的也就十来个。我把它们分成了几类,你记一下就好。
4.2.1 信息查看类
openssl version— 查看版本openssl ciphers -v— 列出支持的加密套件openssl s_client -connect example.com:443— 模拟客户端连接,查看服务器证书
4.2.2 密钥与证书操作类
openssl genrsa— 生成 RSA 私钥openssl ecparam -genkey— 生成 ECC 私钥openssl req— 生成证书签名请求 (CSR)openssl x509— 查看或转换证书
4.2.3 格式转换类
openssl rsa -in key.pem -outform DER -out key.der— PEM 转 DERopenssl pkcs12 -export— 导出为 PKCS#12 格式
核心思路:你不需要背所有命令。记住 genrsa、req、x509、s_client 这四个,就能解决 80% 的问题。
4.3 生成 RSA 密钥对
RSA 是目前最通用的非对称加密算法。虽然 ECC 正在崛起,但 RSA 在兼容性上依然无敌。
4.3.1 生成私钥
openssl genrsa -out rsa_private.pem 2048
这条命令会生成一个 2048 位的 RSA 私钥。为什么是 2048?因为 1024 已经不安全了,4096 又太慢。2048 是当前性价比最高的选择。
4.3.2 提取公钥
openssl rsa -in rsa_private.pem -pubout -out rsa_public.pem
公钥是可以公开的,但私钥必须保密。你可以把公钥发给别人,用来加密数据或验证签名。
4.3.3 查看密钥内容
openssl rsa -in rsa_private.pem -text -noout
这条命令会打印出私钥的详细信息,包括模数、指数、素数等。你不需要完全看懂,但至少要知道里面有什么。
4.4 生成 ECC 密钥对
ECC(椭圆曲线密码学)是 RSA 的现代替代方案。同样的安全强度,ECC 的密钥更短、计算更快。我个人现在新项目都优先用 ECC。
4.4.1 选择曲线
ECC 的关键是曲线参数。常用的曲线有:
| 曲线名称 | 安全强度 | 推荐场景 |
|---|---|---|
| prime256v1 (secp256r1) | 128 位 | 通用场景,兼容性最好 |
| secp384r1 | 192 位 | 高安全场景,性能略低 |
| X25519 | 128 位 | 密钥交换,性能极佳 |
prime256v1。它在浏览器和服务器上的兼容性最好,而且性能足够。
4.4.2 生成 ECC 私钥
openssl ecparam -genkey -name prime256v1 -out ecc_private.pem
这条命令会生成一个基于 prime256v1 曲线的 ECC 私钥。注意,ECC 的私钥文件比 RSA 小得多,只有几百字节。
4.4.3 提取 ECC 公钥
openssl ec -in ecc_private.pem -pubout -out ecc_public.pem
和 RSA 一样,公钥可以公开。你可以对比一下文件大小——ECC 的公钥通常只有 RSA 的十分之一。
4.4.4 查看 ECC 密钥参数
openssl ec -in ecc_private.pem -text -noout
你会看到私钥值、公钥坐标和曲线名称。这些信息在调试时很有用。
4.5 RSA vs ECC:怎么选?
很多同学会问:到底用 RSA 还是 ECC?我直接给你一个对比表:
| 对比维度 | RSA (2048位) | ECC (prime256v1) |
|---|---|---|
| 密钥长度 | 2048 位 | 256 位 |
| 安全强度 | 112 位 | 128 位 |
| 签名速度 | 较慢 | 快 3-5 倍 |
| 兼容性 | 最好 | 良好,但旧设备可能不支持 |
| 推荐场景 | 兼容性要求高的场景 | 新系统、移动端、IoT |
我的建议:如果是内部系统,优先用 ECC。如果是面向公众的 Web 服务,RSA 更稳妥。当然,你也可以两个都生成,根据客户端能力动态选择——这叫「证书链的优雅降级」,后面章节会讲。
4.6 本章知识体系
下面这张图帮你梳理了 OpenSSL 的核心操作流程:
4.7 避坑指南
最后,分享几个我踩过的坑:
- 私钥权限:生成后立刻
chmod 600,别问为什么,问就是吃过亏。 - 备份私钥:私钥丢了,所有基于它的证书都得重新签发。我习惯在离线环境保留一份加密备份。
- 不要用密码保护私钥:虽然
genrsa -aes256可以加密码,但生产环境里每次重启都要手动输入密码,很麻烦。用硬件安全模块(HSM)或密钥管理服务(KMS)更靠谱。 - 区分 PEM 和 DER:PEM 是文本格式,DER 是二进制。大部分场景用 PEM,但 Java 和 Windows 有时需要 DER。
重要:永远不要在日志、错误信息或调试输出中打印私钥内容。我曾经在排查问题时,不小心把私钥 hex dump 打到了日志里,结果被安全审计抓了个正着……嗯,那周的复盘会开得特别长。