2. OpenSSL入门:安装、配置与RSA密钥对生成
说到加密传输和签名验签,OpenSSL 几乎是绕不开的工具。我入行那会儿,第一次接触它是在一个银行接口对接项目里——对方要求用 RSA 签名,我连 OpenSSL 都没装过,折腾了一整天才把密钥对搞出来。现在回头看,其实没那么复杂。
这一章,咱们就把 OpenSSL 的安装、基本用法和 RSA 密钥对生成彻底讲明白。你跟着走一遍,后面所有章节的实操就都有底了。
2.1 OpenSSL 是什么?
OpenSSL 是一个开源的加密工具包。它实现了 SSL/TLS 协议,也提供了各种对称加密、非对称加密、哈希、数字签名等功能。说白了,它就是密码学领域的「瑞士军刀」。
我个人习惯把它分成三块来看:
- 命令行工具:日常生成密钥、查看证书、加解密文件,全靠它
- C 语言库:开发者在代码里调用加密函数
- 配置文件:定义证书请求、CA 策略等参数
咱们这门课主要用命令行工具,偶尔会改改配置文件。你不需要成为 OpenSSL 专家,但得会用那几个核心命令。
核心认知: OpenSSL 不是「一个软件」,而是一套加密工具箱。你不需要记住所有命令,但必须理解它背后的密码学逻辑——密钥、证书、签名、加密,这些概念才是根本。
2.2 安装与配置
2.2.1 各平台安装方式
不同操作系统安装方式差别挺大。我列个表,你按自己的环境选一种就行。
| 操作系统 | 安装方式 | 验证命令 |
|---|---|---|
| Ubuntu/Debian | sudo apt install openssl |
openssl version |
| CentOS/RHEL | sudo yum install openssl |
openssl version |
| macOS | brew install openssl |
openssl version |
| Windows | 下载安装包或使用 WSL | openssl version |
Windows 用户我建议直接用 WSL(Windows Subsystem for Linux),省去很多环境变量配置的麻烦。我之前在 Windows 上装过原生版,路径问题折腾了半小时,后来换 WSL 两分钟搞定。
2.2.2 验证安装
装完之后,打开终端跑一下:
openssl version
正常会输出类似:
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
如果提示「命令未找到」,说明没装好或者没加到 PATH 里。检查一下安装步骤,或者重启终端试试。
小技巧: 我习惯用 openssl version -a 查看完整信息,包括编译参数、默认目录等。这在排查问题时特别有用。
2.3 常用命令速览
OpenSSL 命令多到能写一本书。但咱们实战中常用的,其实就十几个。我按功能分了个类:
| 功能分类 | 常用命令 | 说明 |
|---|---|---|
| 密钥管理 | genrsa, rsa, ecparam, ec |
生成、查看、转换密钥 |
| 证书操作 | req, x509, ca |
生成 CSR、自签证书、CA 签发 |
| 加解密 | enc, rsautl, pkeyutl |
对称/非对称加解密 |
| 哈希与签名 | dgst, pkeyutl -sign |
计算哈希、生成/验证签名 |
| 信息查看 | version, ciphers, s_client |
查看版本、支持的加密套件、测试 TLS 连接 |
你不需要全记住。我自己的做法是:把这张表贴在工位上,用哪个查哪个。用多了自然就记住了。
2.4 生成 RSA 密钥对
这是本章的重头戏。RSA 密钥对包含两部分:私钥(自己留着,打死也不给别人)和公钥(发给别人,随便公开)。
2.4.1 生成私钥
最简单的做法:
openssl genrsa -out private.pem 2048
这条命令干了三件事:
genrsa:生成 RSA 密钥-out private.pem:输出到文件2048:密钥长度,单位是 bit
为什么选 2048?1024 已经被证明不够安全,4096 虽然更安全但加解密速度慢很多。2048 是当前业界公认的「甜点」——安全性和性能的平衡点。我在生产环境里,99% 的场景都用 2048。
注意: 生成的私钥文件默认是明文的。如果服务器被入侵,私钥就泄露了。生产环境一定要加密保护私钥,可以用 -aes256 参数:
openssl genrsa -aes256 -out private.pem 2048
这样每次使用私钥时都需要输入密码。
2.4.2 提取公钥
私钥里其实包含了公钥信息。我们可以单独提取出来:
openssl rsa -in private.pem -pubout -out public.pem
参数说明:
-in private.pem:输入私钥文件-pubout:输出公钥-out public.pem:保存到文件
你可以用 cat public.pem 看看公钥长什么样。它是以 -----BEGIN PUBLIC KEY----- 开头的一串 Base64 编码数据。
2.4.3 查看密钥信息
想确认密钥对不对?用这个:
openssl rsa -in private.pem -text -noout
会输出模数、指数、素数等详细信息。我一般只看两个东西:
- 模数长度:确认是 2048 位
- 公钥指数:通常是 65537(0x10001),这是标准值
如果模数长度不对,或者指数异常,那密钥可能有问题。我曾经遇到过同事用了一个损坏的私钥,签名一直失败,查了半天才发现是密钥生成时磁盘写入了错误数据。
2.4.4 密钥格式转换
不同系统、不同语言对密钥格式要求不一样。最常见的两种格式是 PEM 和 DER:
| 格式 | 特点 | 转换命令 |
|---|---|---|
| PEM | Base64 文本,可读性好 | 默认格式 |
| DER | 二进制,体积小 | openssl rsa -in private.pem -outform DER -out private.der |
Java 那边经常用 PKCS8 格式,转换命令是:
openssl pkcs8 -topk8 -inform PEM -outform PEM -in private.pem -out private_pkcs8.pem -nocrypt
这个命令我几乎每个项目都会用到。Java 的 KeyFactory 默认只认 PKCS8 格式的私钥,直接用 OpenSSL 生成的 PKCS1 格式会报错。
2.5 本章知识体系
下面这张图把 OpenSSL 的核心功能和 RSA 密钥对生成流程串起来了。你对照着看,思路会更清晰。
2.6 避坑指南
最后分享几个我踩过的坑,你遇到了能少走弯路。
坑一:私钥权限
我曾经把私钥文件权限设成了 644,结果被同事不小心 cat 出来发到了群里…… 私钥文件一定要设成 600 或 400:
chmod 600 private.pem
坑二:密钥长度不匹配
有一次对接第三方,对方说用 RSA 2048,结果他们实际用的是 1024。两边密钥长度不一致,签名验证一直失败。所以对接时一定要确认双方密钥参数完全一致——长度、格式、填充方式,一个都不能少。
坑三:换行符问题
Windows 和 Linux 的换行符不一样。如果你在 Windows 上生成密钥,传到 Linux 服务器上用,可能会因为换行符导致解析失败。我习惯统一在 Linux 环境里操作密钥相关的事情,省心。
好了,OpenSSL 的安装和 RSA 密钥对生成就讲到这里。你跟着命令走一遍,把 private.pem 和 public.pem 生成出来,后面章节的签名和加密实操就全靠它们了。