3. OpenSSL 实战入门:安装、密钥对生成与自签名证书
OpenSSL 是证书领域的瑞士军刀。说实话,我每天跟证书打交道,90% 的操作都离不开它。这一章我们直接动手,把 OpenSSL 装好,然后生成密钥对、创建自签名证书,最后再学会怎么看证书内容。
嗯,别小看这些基础操作。我在生产环境排查过太多证书问题,最后发现根源往往是密钥长度不对、签名算法选错、或者证书有效期理解有误。基础打牢,后面才能少踩坑。
3.1 安装 OpenSSL
不同操作系统安装方式不一样。我列个表,你对着自己的环境来就行。
| 操作系统 | 安装命令 / 方式 | 备注 |
|---|---|---|
| Ubuntu / Debian | sudo apt install openssl |
一般系统自带,版本较新 |
| CentOS / RHEL | sudo yum install openssl |
默认安装,版本可能偏老 |
| macOS | brew install openssl |
系统自带 LibreSSL,建议用 Homebrew 装完整版 |
| Windows | 下载安装包或使用 WSL | 推荐 WSL,体验更一致 |
openssl version 确认版本。我个人偏好 1.1.1 以上版本,支持 TLS 1.3 和更完整的算法套件。
3.2 生成 RSA 密钥对
RSA 是目前最通用的非对称加密算法。生成密钥对就两步:先搞私钥,再导出公钥。
3.2.1 生成 RSA 私钥
openssl genrsa -out rsa_private.pem 2048
这条命令干了什么?genrsa 是生成 RSA 密钥的子命令,-out 指定输出文件,2048 是密钥长度。我个人建议至少用 2048 位,1024 位已经不安全了。
3.2.2 从私钥提取公钥
openssl rsa -in rsa_private.pem -pubout -out rsa_public.pem
私钥文件里其实包含了公钥信息。用 -pubout 参数就能单独提取出来。你想想看,公钥是要分发给别人的,私钥必须藏好。
3.3 生成 ECC 密钥对
ECC(椭圆曲线密码学)这两年越来越流行。同样的安全强度,ECC 的密钥比 RSA 短得多,性能也更好。我个人在移动端和 IoT 场景下优先用 ECC。
3.3.1 生成 ECC 私钥
openssl ecparam -genkey -name prime256v1 -out ecc_private.pem
这里 ecparam 是 ECC 参数管理命令,-genkey 表示生成密钥,-name 指定曲线名称。prime256v1 是最常用的曲线,也叫 P-256。
3.3.2 查看曲线列表
openssl ecparam -list_curves
这条命令会列出所有支持的曲线。我常用的就三种:prime256v1、secp384r1、secp521r1。安全强度依次递增,但性能也递减。
3.3.3 提取 ECC 公钥
openssl ec -in ecc_private.pem -pubout -out ecc_public.pem
跟 RSA 的操作逻辑完全一样。说白了,公钥提取这个动作,不管什么算法,套路都差不多。
3.4 创建自签名证书
自签名证书就是自己给自己签发的证书。测试环境、内网服务、开发调试时经常用。生产环境还是得用 CA 签发的证书,这个后面会讲。
3.4.1 一步到位生成证书
openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes
这条命令一次性完成了:生成密钥对 + 创建证书签名请求 + 自签名。参数说明:
-x509:输出自签名证书,而不是 CSR-newkey rsa:2048:同时生成新的 RSA 2048 位密钥-keyout:私钥输出文件-out:证书输出文件-days 365:有效期 1 年-nodes:不加密私钥(no DES)
-nodes 表示私钥文件不设密码。生产环境建议去掉这个参数,每次启动服务时手动输入密码,或者用 HSM 管理。
3.4.2 分步生成(更可控)
我更喜欢分步操作,每一步都能检查中间产物。
- 生成私钥:
openssl genrsa -out mykey.pem 2048 - 生成 CSR:
openssl req -new -key mykey.pem -out mycsr.csr - 自签名:
openssl x509 -req -in mycsr.csr -signkey mykey.pem -out mycert.crt -days 365
分步的好处是,你可以把 CSR 发给 CA 去签名,也可以自己签。灵活度更高。
3.5 查看证书内容
证书生成完了,怎么看里面的信息?我常用的就三条命令。
3.5.1 查看证书明文
openssl x509 -in server.crt -text -noout
这条命令会输出证书的所有字段:颁发者、使用者、有效期、公钥信息、签名算法、扩展项等。-noout 表示不输出证书的 base64 编码,只看解析后的内容。
3.5.2 查看证书有效期
openssl x509 -in server.crt -dates -noout
输出格式:notBefore=Apr 1 00:00:00 2024 GMT 和 notAfter=Apr 1 00:00:00 2025 GMT。我写监控脚本时经常用这个来检查证书是否即将过期。
3.5.3 查看证书指纹
openssl x509 -in server.crt -fingerprint -sha256 -noout
指纹是证书内容的哈希值,用于快速校验证书是否被篡改。我在部署证书后,总会对比一下本地和远程服务器的指纹是否一致。
3.6 本章知识体系
下面这张图把 OpenSSL 的核心操作串起来了。从安装到密钥生成,再到证书创建和查看,每一步都有对应的命令和产出物。
3.7 避坑指南
最后分享几个我实际踩过的坑,你遇到了能少走弯路。
- 私钥权限:私钥文件一定要设置 600 或 400 权限。我曾经见过同事把私钥设成 644,结果被扫描工具扫出来,直接导致安全事件。
- 证书格式混淆:PEM 是文本格式,DER 是二进制格式。很多 Java 应用只认 DER,Nginx 只认 PEM。转换命令:
openssl x509 -in cert.pem -outform der -out cert.der。 - 有效期别设太长:自签名证书我一般不超过 2 年。生产环境 CA 签发的证书现在普遍是 1 年,甚至 90 天。短有效期能倒逼你自动化更新。
- SAN 扩展别忘了:现代浏览器要求证书必须包含 Subject Alternative Name。生成 CSR 时用
-addext "subjectAltName=DNS:example.com"加上去。
openssl verify -CAfile ca.crt server.crt 验证一下证书链是否完整。这个习惯帮我抓出过好几次中间证书遗漏的问题。
好了,这一章的内容就到这里。OpenSSL 的命令虽然多,但核心操作就那么几个。你多练几遍,形成肌肉记忆,后面做自动化更新时就顺手了。