OpenSSL 入门:安装、基本命令与自签名证书
讲 mTLS,绕不开 OpenSSL。它是整个证书世界的瑞士军刀。我个人习惯在任何一台 Linux 机器上都先装上它,哪怕只是用来查看证书过期时间。这一章我们从头走一遍:怎么装、怎么用、怎么给自己签一张能用的证书。
为什么非要学 OpenSSL
你想想看,微服务之间做 mTLS,底层靠的就是 X.509 证书。但证书从哪来?生产环境有 CA,开发测试呢?你总不能每次打个测试都去找安全团队申请吧。OpenSSL 就是你自己的小 CA——生成私钥、签发证书、验证链,一条龙。
我在项目里遇到过一件事:测试环境证书过期,整个集群瘫痪了半小时。后来我用 OpenSSL 写了个脚本,每周自动检查证书有效期。嗯,自那以后我再也没被半夜叫起来过。
安装 OpenSSL
不同平台装法不一样,但核心都一样。
| 平台 | 安装命令 | 备注 |
|---|---|---|
| Ubuntu / Debian | sudo apt install openssl | 通常自带,版本较新 |
| CentOS / RHEL | sudo yum install openssl | 有时需要 epel 源 |
| macOS | brew install openssl | 系统自带版本旧,建议 brew 安装 |
| Windows | 从 slproweb.com 下载 Win64 OpenSSL | 安装后加到 PATH |
openssl version,看到类似 OpenSSL 1.1.1w 11 Sep 2023 就算成了。低于 1.1.1 的版本不建议用于生产,TLS 1.3 支持不全。
常用基本命令
命令虽然多,但真正高频的也就那么几条。我整理了一个速查表,你照着敲就行。
| 用途 | 命令示例 | 说人话版本 |
|---|---|---|
| 查看证书内容 | openssl x509 -in cert.pem -text -noout | 把证书的明文信息打印出来 |
| 生成私钥 | openssl genrsa -out key.pem 2048 | 生成 2048 位的 RSA 私钥 |
| 生成 CSR | openssl req -new -key key.pem -out csr.pem | 根据私钥创建证书签名请求 |
| 自签名证书 | openssl req -x509 -newkey rsa:2048 -days 365 -keyout key.pem -out cert.pem | 一步到位:私钥 + 自签名证书 |
| 计算公钥指纹 | openssl x509 -in cert.pem -fingerprint -sha256 -noout | 常用于校验一致性 |
| 转换格式 | openssl pkcs12 -export -in cert.pem -inkey key.pem -out bundle.p12 | PEM 转 PKCS#12,Java 那边常用 |
openssl x509 -in cert.pem -dates -noout 确认有效期。别问为什么,问就是踩过坑。
生成自签名证书——手把手
说白了,自签名证书就是自己当 CA,自己给自己发证。测试环境完全够用,生产环境请找正经 CA。
我们分两步走,这样你更容易理解每一步在干什么。
第一步:生成私钥
openssl genrsa -out server.key 2048
这个命令生成一个 2048 位的 RSA 私钥。2048 位是目前行业底线,别再偷懒用 1024 了,不安全。
第二步:生成自签名证书
openssl req -x509 -new -nodes -key server.key -sha256 -days 365 \
-out server.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=localhost"
解释几个参数:
-x509:直接输出证书,跳过 CSR 步骤-nodes:不加密私钥,方便 Nginx 等自动加载(生产慎用)-days 365:有效期一年,别太长-subj:一次性填完 DN,省得交互问答
执行完后,目录里会多出 server.key 和 server.crt 两个文件。前者是私钥,后者是公钥证书(自签的)。
检查证书内容
生成完别急着用,先看一眼里面有什么。
openssl x509 -in server.crt -text -noout | less
你会看到 Signature Algorithm、Issuer、Subject、Validity、Subject Public Key Info 等字段。注意看 Issuer 和 Subject 是不是一样——自签名证书嘛,它们两个值是相同的。
openssl x509 -in server.crt -purpose -noout 可以看这张证书能被用在哪些场景。如果显示 "Any Purpose" 说明啥都能干,但严格场景下建议你用扩展字段限制用途。
避坑指南
- 私钥加密问题:很多教程用
-newkey rsa:2048会弹框让你输密码。如果你期望自动加载,记得加-nodes。否则每次重启服务都要输一遍密码,烦死你。 - CN 与 SAN:现在浏览器和较新的 TLS 库已经不看 CN(Common Name)了,必须设置 Subject Alternative Names。我吃过亏,用
openssl.cnf配置文件加 SAN 才是正道。这个稍后会单独讲。 - 日期格式:有些旧版 OpenSSL 输出的日期是
notBefore=Jan 1 00:00:00 2024 GMT,用-dateopt iso8601可以输出更易读的 ISO 格式(1.1.1 以上版本支持)。 - 权限:私钥文件默认权限是 644,你得手动
chmod 600 server.key。我之前部署时没注意,结果安全扫描直接把服务判为高危。
好了,到这一步你已经能自己搓出一张自签名证书了。下一块内容我们会讲怎么把这张证书塞进 Spring Boot 和 Envoy 里让它真正跑起来。