4、生成RSA密钥对:使用OpenSSL生成RSA私钥、提取公钥、密钥文件格式(PEM/DER)

好,咱们进入实战环节。RSA密钥对是整个证书体系的基石。说白了,你后面签发的每一张证书,都离不开今天生成的这对钥匙。

我记得刚入行那会儿,觉得生成密钥就是个敲命令的活儿,没什么技术含量。直到有一次线上环境出了故障,排查半天才发现是密钥格式不兼容——嗯,从那以后我再也不敢小看这一步了。

4.1 什么是RSA密钥对?

RSA是一种非对称加密算法。它生成两个密钥:一个私钥,一个公钥。私钥你自己藏好,公钥可以发给任何人。

  • 私钥:用于签名和解密。必须严格保密。
  • 公钥:用于验签和加密。可以公开分发。

你想想看,这就像一把锁和一把钥匙。你用私钥(钥匙)锁上数据,别人用公钥(锁)来验证是你锁的。反过来,别人用公钥加密数据,只有你能用私钥解开。

核心要点:私钥一旦泄露,整个信任体系就崩塌了。我在项目中见过有人把私钥硬编码在代码里提交到Git仓库……后果很严重。

4.2 使用OpenSSL生成RSA私钥

OpenSSL是生成密钥的标配工具。我个人习惯用2048位,安全性和性能比较均衡。4096位更安全,但加解密速度会慢一些。

生成私钥的基本命令:

openssl genrsa -out private.key 2048

这条命令会生成一个2048位的RSA私钥,保存到 private.key 文件中。默认输出格式是PEM。

如果你想查看私钥的详细信息:

openssl rsa -in private.key -text -noout

输出会显示模数、公钥指数、私钥指数等数学参数。嗯,这些参数你不用记,但知道它们存在就好。

我的习惯:生成私钥后,我通常会立刻设置文件权限为600,防止其他用户读取。命令:chmod 600 private.key

4.3 从私钥中提取公钥

私钥里其实已经包含了公钥信息。你只需要把它提取出来就行:

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

这条命令会从 private.key 中提取公钥,保存到 public.key。公钥文件可以放心分发。

验证一下提取是否正确:

openssl rsa -in public.key -pubin -text -noout

你会看到公钥的模数和公钥指数。对比一下私钥里的对应参数,应该完全一致。

注意:千万不要把私钥文件发给别人。我曾经见过有人把 private.key 和 public.key 一起打包发给客户……那等于把家门钥匙和锁一起给了别人。

4.4 密钥文件格式:PEM vs DER

OpenSSL支持两种主要的密钥文件格式:PEM和DER。它们的区别很明显。

特性 PEM DER
编码方式 Base64文本 二进制
可读性 可读,有头尾标记 不可读
文件大小 稍大(约多30%) 更紧凑
常见用途 Web服务器、证书文件 Java、Windows系统
头尾标记 有(如 -----BEGIN RSA PRIVATE KEY-----) 无

PEM格式长这样:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA...
...(Base64编码数据)...
-----END RSA PRIVATE KEY-----

DER格式就是纯二进制,你用文本编辑器打开会看到一堆乱码。

4.5 格式转换

实际工作中经常需要在PEM和DER之间转换。OpenSSL提供了简单的命令。

PEM转DER:

openssl rsa -in private.pem -outform DER -out private.der

DER转PEM:

openssl rsa -in private.der -inform DER -out private.pem

公钥的转换类似,加上 -pubin 参数即可。

避坑指南:我曾经在对接一个Java系统时,对方要求DER格式的私钥。我直接发了PEM过去,结果对方解析失败。后来才知道Java的KeyStore默认用DER。所以,搞清楚对方要什么格式再发。

4.6 知识体系总览

下面这张图帮你理清RSA密钥对生成的整体流程:

RSA密钥对生成与格式转换流程 OpenSSL genrsa RSA私钥 (private.key / PEM) 提取公钥 (openssl rsa -pubout) RSA公钥 (public.key / PEM) 格式转换:PEM ↔ DER

4.7 实战建议

最后,分享几个我在项目中积累的经验:

  • 密钥长度选择:2048位是当前主流,兼容性好。如果对安全性要求极高,用4096位。
  • 文件命名规范:我习惯用 server.key 和 server.pub,一目了然。
  • 备份私钥:生成后立刻备份到安全位置,比如加密的U盘或密码管理器。
  • 不要用密码保护私钥:虽然OpenSSL支持 -des3 参数加密私钥,但生产环境通常不用,因为每次重启服务都要输密码,容易出问题。

再次强调:私钥文件不要放在Web根目录下,不要提交到Git仓库,不要通过不加密的渠道传输。我曾经见过一个项目,私钥文件就放在 /var/www/html/ 下面,任何人都能直接下载……那等于把服务器的大门敞开了。

好了,RSA密钥对生成这部分就讲到这里。你动手试试,敲一遍命令,看看生成的PEM文件和DER文件有什么区别。实践出真知。