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完全一致,省得记两套。
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 本章知识体系
下面这张图帮你梳理本章的核心逻辑:
2.6 避坑指南
最后分享几个我踩过的坑:
- 密钥长度别用1024:1024位的RSA已经被认为不安全了。我建议至少2048位,有条件上4096位。
- 私钥文件权限:在Linux下,私钥文件权限要设为600(只有自己可读写)。我曾经因为权限太松,被安全扫描工具报过漏洞。
- PEM vs DER:PEM是Base64编码的文本格式,DER是二进制格式。大部分场景用PEM就够了,可读性好。
- 备份私钥:私钥丢了就再也找不回来了。我习惯生成后立刻备份到加密U盘或密码管理器里。