2. OpenSSL入门:安装、配置与RSA密钥对生成

说实话,很多搞了几年开发的同事,一提到OpenSSL就头疼。命令行参数又多又长,文档还全是英文。但你要做签名验签、数字证书,这关必须过。我当年第一次用OpenSSL生成密钥对时,就因为少写了一个参数,折腾了整整一下午。

这一章,咱们就把OpenSSL的安装、配置和常用命令捋一遍。重点放在RSA密钥对的生成上——这是后面所有章节的基础。

2.1 什么是OpenSSL?

OpenSSL是一个开源的加密工具包。它实现了SSL/TLS协议,也提供了各种加密算法、哈希函数、证书操作的命令行接口。说白了,它就是密码学领域的瑞士军刀。

我个人习惯把它装在开发环境里,日常调试签名、验证证书链都靠它。生产环境我建议用更轻量的库,但学习和实验阶段,OpenSSL绝对够用。

2.2 安装与配置

2.2.1 Windows环境

Windows下安装OpenSSL,我推荐两种方式:

  • 方式一:下载预编译的二进制安装包(如Shining Light Productions提供的Win64 OpenSSL)。安装后记得把C:\Program Files\OpenSSL-Win64\bin加到系统PATH里。
  • 方式二:用WSL(Windows Subsystem for Linux),直接在Linux子系统中apt install openssl。我更喜欢这种方式,因为命令和Linux完全一致,省得记两套。
注意:Windows下安装后,记得打开命令行输入openssl version验证。如果提示“不是内部或外部命令”,那就是PATH没配好。我曾经在这上面浪费过半小时。

2.2.2 Linux/macOS环境

Linux和macOS通常自带OpenSSL。你可以先检查版本:

openssl version -a

如果版本太旧(比如低于1.1.1),建议升级。我遇到过因为OpenSSL版本过低,导致某些新算法不支持的情况。

macOS用户注意:系统自带的LibreSSL和OpenSSL不完全兼容。我建议用Homebrew重新安装:

brew install openssl
echo 'export PATH="/usr/local/opt/openssl/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

2.2.3 验证安装

安装完成后,运行以下命令确认一切正常:

openssl version

你应该看到类似这样的输出:

OpenSSL 3.0.12 24 Oct 2023 (Library: OpenSSL 3.0.12 24 Oct 2023)

2.3 常用命令概览

OpenSSL的命令结构是:openssl [子命令] [选项] [参数]。子命令非常多,但咱们做签名验签和证书,常用的就这几个:

子命令 用途 我常用的场景
genrsa 生成RSA私钥 生成密钥对的第一步
rsa 管理RSA密钥(提取公钥、转换格式) 从私钥里提取公钥发给别人
req 生成证书签名请求(CSR)或自签名证书 测试环境快速生成证书
x509 查看和操作X.509证书 检查证书有效期、颁发者
dgst 计算消息摘要(哈希值) 签名前对文件做哈希
pkeyutl 通用非对称密钥操作(签名、验签、加密、解密) 替代老旧的rsautl

嗯,这里要注意:genrsa在OpenSSL 3.0里已经被标记为“遗留”了,官方推荐用genpkey。但我个人习惯还是用genrsa,因为参数更直观。咱们后面会两种都演示。

2.4 生成RSA密钥对

这是本章的重头戏。生成RSA密钥对,说白了就是生成一对数学上关联的密钥:一个私钥(自己藏好),一个公钥(发给别人)。

2.4.1 生成私钥

先来生成一个2048位的RSA私钥:

openssl genrsa -out private.pem 2048

这条命令干了三件事:

  • 生成2048位的RSA私钥
  • 用PEM格式保存到private.pem文件
  • 默认不加密私钥文件(注意安全!)

如果你希望私钥文件本身也加密,可以加个-aes256参数:

openssl genrsa -aes256 -out private_encrypted.pem 2048

运行后会让你输入密码。每次使用这个私钥时都需要输入密码。我在项目中给客户交付密钥对时,都会要求加密私钥文件——这是基本的安全意识。

2.4.2 提取公钥

有了私钥,公钥可以从中提取出来:

openssl rsa -in private.pem -pubout -out public.pem

这条命令从private.pem里读取私钥,提取对应的公钥,保存到public.pem。你可以把public.pem发给任何人。

2.4.3 查看密钥内容

想看看密钥里面长什么样?用这个命令:

openssl rsa -in private.pem -text -noout

输出会显示模数(modulus)、公钥指数(publicExponent)、私钥指数(privateExponent)等数学参数。你不需要记住这些参数的含义,但知道它们存在就行——后面做签名验签时,这些参数会被OpenSSL自动使用。

小技巧:用-noout参数可以只显示文本信息,不输出密钥的Base64编码。这样屏幕不会刷屏。

2.4.4 使用genpkey(OpenSSL 3.0推荐方式)

如果你用的是OpenSSL 3.0及以上版本,官方推荐用genpkey:

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private.pem

效果和genrsa一样。我个人觉得genrsa更简洁,但为了“与时俱进”,建议你也熟悉genpkey的写法。

2.5 本章知识体系

下面这张图帮你梳理本章的核心逻辑:

OpenSSL入门与RSA密钥对生成知识体系 OpenSSL入门与RSA密钥对生成 安装与配置 常用命令概览 生成RSA密钥对 Windows Linux/macOS genrsa rsa req x509 生成私钥 提取公钥 查看密钥内容 genpkey方式 核心产出:private.pem(私钥) + public.pem(公钥) 私钥自己保管,公钥分发给通信对方

2.6 避坑指南

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

  • 密钥长度别用1024:1024位的RSA已经被认为不安全了。我建议至少2048位,有条件上4096位。
  • 私钥文件权限:在Linux下,私钥文件权限要设为600(只有自己可读写)。我曾经因为权限太松,被安全扫描工具报过漏洞。
  • PEM vs DER:PEM是Base64编码的文本格式,DER是二进制格式。大部分场景用PEM就够了,可读性好。
  • 备份私钥:私钥丢了就再也找不回来了。我习惯生成后立刻备份到加密U盘或密码管理器里。