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密钥对生成的整体流程:
4.7 实战建议
最后,分享几个我在项目中积累的经验:
- 密钥长度选择:2048位是当前主流,兼容性好。如果对安全性要求极高,用4096位。
- 文件命名规范:我习惯用
server.key和server.pub,一目了然。 - 备份私钥:生成后立刻备份到安全位置,比如加密的U盘或密码管理器。
- 不要用密码保护私钥:虽然OpenSSL支持
-des3参数加密私钥,但生产环境通常不用,因为每次重启服务都要输密码,容易出问题。
再次强调:私钥文件不要放在Web根目录下,不要提交到Git仓库,不要通过不加密的渠道传输。我曾经见过一个项目,私钥文件就放在 /var/www/html/ 下面,任何人都能直接下载……那等于把服务器的大门敞开了。
好了,RSA密钥对生成这部分就讲到这里。你动手试试,敲一遍命令,看看生成的PEM文件和DER文件有什么区别。实践出真知。