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,省心很多
我的建议:在 macOS 上,千万别直接用系统自带的 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 转 DER
  • openssl 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 是当前性价比最高的选择。

注意:私钥文件一定要保护好。我曾经见过有人把私钥直接传到 GitHub 上,结果几分钟内就被爬虫扫到了。嗯,那场面……很尴尬。

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 的核心操作流程:

OpenSSL 密钥对生成流程 安装 OpenSSL 选择算法 RSA: genrsa -out 2048 ECC: ecparam -genkey prime256v1 提取公钥: rsa -pubout 提取公钥: ec -pubout 密钥对就绪 说明 私钥保密,公钥分发

4.7 避坑指南

最后,分享几个我踩过的坑:

  • 私钥权限:生成后立刻 chmod 600,别问为什么,问就是吃过亏。
  • 备份私钥:私钥丢了,所有基于它的证书都得重新签发。我习惯在离线环境保留一份加密备份。
  • 不要用密码保护私钥:虽然 genrsa -aes256 可以加密码,但生产环境里每次重启都要手动输入密码,很麻烦。用硬件安全模块(HSM)或密钥管理服务(KMS)更靠谱。
  • 区分 PEM 和 DER:PEM 是文本格式,DER 是二进制。大部分场景用 PEM,但 Java 和 Windows 有时需要 DER。

重要:永远不要在日志、错误信息或调试输出中打印私钥内容。我曾经在排查问题时,不小心把私钥 hex dump 打到了日志里,结果被安全审计抓了个正着……嗯,那周的复盘会开得特别长。