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 密钥对生成流程串起来了。你对照着看,思路会更清晰。

OpenSSL 核心功能与 RSA 密钥对生成流程 OpenSSL 核心功能与 RSA 密钥对生成流程 OpenSSL 工具箱 命令行工具 C 语言库 配置文件 密钥管理 证书操作 加解密 哈希与签名 RSA 密钥对生成 genrsa 生成私钥 rsa 提取公钥 格式转换(可选) private.pem public.pem private_pkcs8.pem 核心流程总结 安装 OpenSSL → 使用 genrsa 生成私钥 → 使用 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 生成出来,后面章节的签名和加密实操就全靠它们了。