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 位已经不安全了。

我曾经踩过的坑:有次在 CI 环境里忘了指定密钥长度,默认生成了 512 位。结果证书签发后,所有客户端握手都报错「密钥太弱」。从那以后,我每次生成密钥都会显式指定长度。

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 分步生成(更可控)

我更喜欢分步操作,每一步都能检查中间产物。

  1. 生成私钥:openssl genrsa -out mykey.pem 2048
  2. 生成 CSR:openssl req -new -key mykey.pem -out mycsr.csr
  3. 自签名: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 的核心操作串起来了。从安装到密钥生成,再到证书创建和查看,每一步都有对应的命令和产出物。

OpenSSL 实战操作流程 1. 安装 OpenSSL 2. 生成密钥对(RSA / ECC) RSA: genrsa + rsa ECC: ecparam + ec 3. 创建自签名证书 4. 查看证书内容 产出物:私钥(.pem/.key) + 证书(.crt/.pem) + 公钥(.pem)

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 的命令虽然多,但核心操作就那么几个。你多练几遍,形成肌肉记忆,后面做自动化更新时就顺手了。