3. OpenSSL入门

好,咱们正式开始敲命令了。这章我带你搞定 OpenSSL 的安装、配置,再亲手生成一对 RSA 和一对 ECC 密钥。说白了,OpenSSL 就是一把瑞士军刀,后面所有证书操作都离不开它。

为什么先讲这个?因为你在生产环境里遇到的 TLS 问题,九成以上都能用 OpenSSL 诊断。我自己的习惯是,不管什么项目,第一件事先把 OpenSSL 装好,版本搞对,后面才不慌。

一句话记住: OpenSSL 是 TLS 世界的「Hello World」,你会反复用到它。

安装与配置:别在第一步翻车

OpenSSL 的安装其实很直白。Windows、macOS、Linux 各有各的招,但坑也不少。我记得有一次帮同事排查环境问题,搞了半天发现他装了俩版本,命令调的是旧版——嗯,这种事我见多了。

各平台安装速查

平台 推荐方式 验证命令
Ubuntu/Debian sudo apt install openssl openssl version
CentOS/RHEL sudo yum install openssl openssl version
macOS brew install openssl /usr/local/opt/openssl/bin/openssl version
Windows 下载安装包或 WSL 打开 cmd 输入 openssl version
避坑: 我曾因为 macOS 自带的 LibreSSL 和 OpenSSL 命令冲突,折腾了半天。现在我的做法是:用 Homebrew 装完 OpenSSL 后,把路径加到 ~/.zshrc,确保 which openssl 指向对的版本。

装完之后,我建议你跑一句 openssl version -a,看看编译参数和 OpenSSL 目录。如果你要商用或者做高安全环境,得确认有没有编译进 enable-ec 和 enable-sm2 这些特性。我见过有发行版把 ECC 支持给阉割了,你想想看,后面生成 ECC 密钥时直接报错,多冤枉。

常用命令结构:记住这三板斧

OpenSSL 命令多到能写一本书,但你只要记住一个核心模式就够了:

openssl <子命令> [选项] [参数]

说白了就是:告诉 OpenSSL 你要干啥(生成、查看、签名),再给它一堆参数。我常用的子命令其实就这几个:

  • genrsa / ecparam —— 生成密钥对
  • req —— 生成证书签名请求(CSR)
  • x509 —— 查看或自签证书
  • s_client —— 测试 TLS 连接

举个例子,你想生成一个 RSA 私钥并查看它:

openssl genrsa -out mykey.pem 2048
openssl rsa -in mykey.pem -text -noout

为什么 -text -noout?因为光看私钥内容没啥用,我要看它的模数、指数、是不是 PKCS#1 格式。这些信息在调试证书配对问题时特别有用。

小技巧: 我一般习惯用 openssl help 列所有子命令。记不住参数?没事,man openssl 或者 openssl 子命令 -help 随时救急。别硬背,会用文档才是真本事。

生成 RSA 密钥对:老朋友了

RSA 密钥对是业界老大哥。虽然 ECC 越来越流行,但 RSA 兼容性最好,很多老旧系统只认它。

生成 RSA 私钥很简单:

openssl genrsa -out rsa_private.pem 2048

这里 2048 是密钥长度。我个人建议:最低 2048 位,别用 1024 了——在 2025 年的今天,1024 位的 RSA 基本等于没锁门。至于 4096,性能开销大了点,除非你特别在意安全,否则 2048 够用。

从私钥提取公钥:

openssl rsa -in rsa_private.pem -pubout -out rsa_public.pem

你看,私钥和公钥本来就是一对。提取公钥时,OpenSSL 会自动从私钥里算出对应的公钥。我遇到过有人自己写脚本拼公钥,结果拼错格式……直接用 OpenSSL 它不香吗?

查看密钥细节:

openssl rsa -in rsa_private.pem -text -noout

你会看到 modulus(模数)、publicExponent(公钥指数,通常 65537)、privateExponent 这些参数。嗯,这里要注意:如果 privateExponent 长度和模数差不多,说明密钥结构是对的。

生成 ECC 密钥对:快、小、现代

ECC 密钥对是目前的主流。它比 RSA 更小更快,同样的安全强度,ECC 256 位≈ RSA 3072 位。为什么?因为它基于椭圆曲线离散对数问题,数学上更紧凑。

ECC 密钥对生成分两步:先选曲线,再生成密钥。

列出支持的曲线

openssl ecparam -list_curves

这里你会看到一堆名字:prime256v1、secp384r1、secp521r1……我个人最常用 prime256v1(也叫 P-256),因为它被几乎所有浏览器和服务器支持。

生成 ECC 私钥

openssl ecparam -genkey -name prime256v1 -out ecc_private.pem

注意这里用的是 ecparam,不是 genrsa。curve 名字写错一点就报错,我见过有人把 prime256v1 打成 prime256v2……那当然是生成不了的。

提取 ECC 公钥:

openssl ec -in ecc_private.pem -pubout -out ecc_public.pem

查看 ECC 密钥细节:

openssl ec -in ecc_private.pem -text -noout

你会看到私钥(priv)、公钥(pub)和曲线名称。如果曲线名称不对,那这个密钥基本就废了。

深刻教训: 我曾在生产服务器上发现,某厂商的硬件安全模块(HSM)只支持特定的 NIST 曲线。如果你用自定义曲线或者 Brainpool 曲线,它直接罢工。所以上线前一定确认好环境支持的曲线列表。

RSA vs ECC:一张表看清

对比维度 RSA(2048 位) ECC(P-256)
密钥长度 2048 位 256 位
安全强度 112 位 128 位
生成速度 慢(随机选素数) 快(点乘运算)
兼容性 极好 好(现代设备都支持)
典型场景 老旧系统、根证书 Web 服务器、移动端

你看完可能会有个问题:那我选哪个?我一般的建议是:除非有兼容性限制,否则用 ECC P-256。又快又小,而且未来十年都够用。

个人经验: 我的笔记本上同时保存 RSA 2048 和 ECC P-256 的测试密钥。遇到不同的客户环境,直接切着用。但生产环境我几乎只用 ECC。

本章知识脉络:一张图看懂

为了让你更清楚这三个知识点的关系,我画了张图。你一看就明白了:OpenSSL 是总入口,底下分安装配置、命令结构、密钥生成三大块,最终输出 RSA 和 ECC 两套密钥对。

OpenSSL 入门知识体系 OpenSSL 安装与配置 常用命令结构 生成密钥对 RSA 密钥对 ECC 密钥对 核心:genrsa / ecparam 生成 → rsa / ec 查看 → .pem 文件保存

你可以把这张图存下来。后面 27 章,每接触一个新的 OpenSSL 子命令,回来看看这张图,就知道它挂在哪条分支下。

本章核心: OpenSSL 安装 → 记牢 openssl 子命令 [选项] [参数] 这个结构 → 熟练生成 RSA 2048 和 ECC P-256 密钥对。这三步走顺了,后面学 CSR、证书、链验证才会轻松。