OpenSSL 入门:安装、基本命令与自签名证书

讲 mTLS,绕不开 OpenSSL。它是整个证书世界的瑞士军刀。我个人习惯在任何一台 Linux 机器上都先装上它,哪怕只是用来查看证书过期时间。这一章我们从头走一遍:怎么装、怎么用、怎么给自己签一张能用的证书。

为什么非要学 OpenSSL

你想想看,微服务之间做 mTLS,底层靠的就是 X.509 证书。但证书从哪来?生产环境有 CA,开发测试呢?你总不能每次打个测试都去找安全团队申请吧。OpenSSL 就是你自己的小 CA——生成私钥、签发证书、验证链,一条龙。

我在项目里遇到过一件事:测试环境证书过期,整个集群瘫痪了半小时。后来我用 OpenSSL 写了个脚本,每周自动检查证书有效期。嗯,自那以后我再也没被半夜叫起来过。

安装 OpenSSL

不同平台装法不一样,但核心都一样。

平台安装命令备注
Ubuntu / Debiansudo apt install openssl通常自带,版本较新
CentOS / RHELsudo yum install openssl有时需要 epel 源
macOSbrew 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 私钥
生成 CSRopenssl 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.p12PEM 转 PKCS#12,Java 那边常用
我的习惯:每次生成证书,我都会顺手跑一遍 openssl x509 -in cert.pem -dates -noout 确认有效期。别问为什么,问就是踩过坑。

生成自签名证书——手把手

说白了,自签名证书就是自己当 CA,自己给自己发证。测试环境完全够用,生产环境请找正经 CA。

我们分两步走,这样你更容易理解每一步在干什么。

第一步:生成私钥

openssl genrsa -out server.key 2048

这个命令生成一个 2048 位的 RSA 私钥。2048 位是目前行业底线,别再偷懒用 1024 了,不安全。

警告:私钥文件一定要保管好!权限设为 600,别被意外拷贝。我曾经见过开发同学把私钥直接提交到 Git 仓库…场面一度很尴尬。

第二步:生成自签名证书

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 里让它真正跑起来。

自签名证书生成流程 生成私钥 openssl genrsa 生成 CSR openssl req -new 自签名证书 openssl req -x509 server.key (私钥) server.crt (自签名证书) 提示 实际测试中,你也可以用「一步到位」命令跳过 CSR 步骤。 但为了理解证书链,建议至少手动分离一次看中间产物。