3. OpenSSL入门
好,咱们正式开始敲命令了。这章我带你搞定 OpenSSL 的安装、配置,再亲手生成一对 RSA 和一对 ECC 密钥。说白了,OpenSSL 就是一把瑞士军刀,后面所有证书操作都离不开它。
为什么先讲这个?因为你在生产环境里遇到的 TLS 问题,九成以上都能用 OpenSSL 诊断。我自己的习惯是,不管什么项目,第一件事先把 OpenSSL 装好,版本搞对,后面才不慌。
安装与配置:别在第一步翻车
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 |
~/.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)和曲线名称。如果曲线名称不对,那这个密钥基本就废了。
RSA vs ECC:一张表看清
| 对比维度 | RSA(2048 位) | ECC(P-256) |
|---|---|---|
| 密钥长度 | 2048 位 | 256 位 |
| 安全强度 | 112 位 | 128 位 |
| 生成速度 | 慢(随机选素数) | 快(点乘运算) |
| 兼容性 | 极好 | 好(现代设备都支持) |
| 典型场景 | 老旧系统、根证书 | Web 服务器、移动端 |
你看完可能会有个问题:那我选哪个?我一般的建议是:除非有兼容性限制,否则用 ECC P-256。又快又小,而且未来十年都够用。
本章知识脉络:一张图看懂
为了让你更清楚这三个知识点的关系,我画了张图。你一看就明白了:OpenSSL 是总入口,底下分安装配置、命令结构、密钥生成三大块,最终输出 RSA 和 ECC 两套密钥对。
你可以把这张图存下来。后面 27 章,每接触一个新的 OpenSSL 子命令,回来看看这张图,就知道它挂在哪条分支下。
openssl 子命令 [选项] [参数] 这个结构 → 熟练生成 RSA 2048 和 ECC P-256 密钥对。这三步走顺了,后面学 CSR、证书、链验证才会轻松。