OpenSSL 基础:安装、配置与核心命令
说实话,每次配置 TLS 环境,我第一件事就是检查 OpenSSL 的版本。这玩意儿就像瑞士军刀,基础但必不可少。我自己在项目中见过太多次因为 OpenSSL 版本不对而导致证书生成失败的情况,所以咱们先从最基础的开始。
1. 安装与配置
OpenSSL 的安装很简单。但不同系统有细微差别,我习惯先确认一下。
| 系统 | 安装命令 | 我的经验 |
|---|---|---|
| Debian/Ubuntu | sudo apt install openssl |
默认源里的版本通常够用,但记得 openssl version 看一眼 |
| CentOS/RHEL | sudo yum install openssl |
老版本 CentOS 可能只带 1.0.2,很多新特性不支持,我踩过坑 |
| macOS | brew install openssl |
系统自带的 LibreSSL 不兼容,必须用 Homebrew 装官方版 |
📌 我常用的检查方式:
装完后跑
装完后跑
openssl version -a,看看编译参数里有没有 enable-ec 和 enable-tls1_3。缺了这两个,后面会很难受。
2. 核心概念
在用 OpenSSL 之前,你得搞明白三个东西:密钥、CSR、证书。它们的关系很简单:
- 密钥(Key):私有的,你得藏好。丢了它,你的证书就等于废纸。
- CSR(证书签名请求):公开部分 + 你的身份信息,发给 CA 去签名。
- 证书(Certificate):CA 签过字的 CSR,别人用它来验证你的身份。
你想想看,这三者缺了任何一个,TLS 握手都完不成。我记得有一回客户报错说证书装不上,我检查半天发现是私钥和证书不匹配——他们自己手动改过 CSR 的 CN 字段。
| 文件类型 | 是否公开 | 扩展名 | 一句话说明 |
|---|---|---|---|
| 私钥 | ❌ 不公开 | .key 或 .pem |
你的秘密,用来解密别人发给你的数据 |
| CSR | ✅ 可以公开 | .csr |
你申请证书的“申请书” |
| 证书 | ✅ 必须公开 | .crt 或 .pem |
CA 给你的“身份证” |
⚠️ 我曾经犯过的错:
直接把私钥放在 Nginx 的配置文件同目录下,没设权限。结果被扫描工具扫出来,立马被安全团队约谈。记住:私钥权限设
直接把私钥放在 Nginx 的配置文件同目录下,没设权限。结果被扫描工具扫出来,立马被安全团队约谈。记住:私钥权限设
400 或 600,目录设 700。
3. 常用命令实战
我个人习惯把这组命令背得滚瓜烂熟,因为几乎每个 TLS 项目都会用到。
3.1 生成私钥
生成 RSA 私钥是最常见的。通常情况下用 2048 位就够了,但如果你不放心,可以用 4096。
# 生成 2048 位 RSA 私钥
openssl genrsa -out server.key 2048
# 如果需要加密保护私钥(加个密码)
openssl genrsa -aes256 -out server.key 2048
🔐 我的习惯:
生产环境我从来不加密码,因为 Nginx 启动时需要自动加载私钥,加了密码每次重启都得手动输,运维排障时会急死人。但测试环境我会加密码,防止测试人员手滑误用。
生产环境我从来不加密码,因为 Nginx 启动时需要自动加载私钥,加了密码每次重启都得手动输,运维排障时会急死人。但测试环境我会加密码,防止测试人员手滑误用。
3.2 从私钥提取公钥
有时候别人只需要你的公钥做验证,你不能把整个私钥给他。
# 从私钥中提取公钥
openssl rsa -in server.key -pubout -out server.pub
嗯,这个命令我几乎是肌肉记忆了。每次 CI/CD 流水线里分发密钥时都得跑一遍。
3.3 生成 CSR
生成 CSR 时,你需要提供一些信息。最常见的是 CN(Common Name),也就是你的域名。
# 用刚才的私钥生成 CSR
openssl req -new -key server.key -out server.csr
# 如果你想一步到位(非交互式),可以这样
openssl req -new -key server.key -out server.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=IT/CN=www.example.com"
这里有个坑——CN 必须和你的网站域名完全一致。我遇到过有人写 example.com 但实际用的是 www.example.com,结果浏览器直接报证书错误。
💡 小技巧:
如果你需要支持多个域名,别写在 CN 里,应该在
如果你需要支持多个域名,别写在 CN 里,应该在
subjectAltName 里加。这个后面生成证书时再写。
3.4 生成自签名证书
自签名证书最适合开发和测试阶段。生产环境不建议用,但你要是只是内网调试,完全够用。
# 一步到位,生成私钥 + 自签名证书(有效期365天)
openssl req -x509 -newkey rsa:2048 -keyout server.key \
-out server.crt -days 365 -nodes
# 如果你已有私钥,只生成证书
openssl req -x509 -key server.key -out server.crt -days 365 \
-subj "/CN=localhost"
⚠️ 我踩过的坑:
自签名证书的
自签名证书的
-days 参数我建议别写太长,最多 365 天。我曾经图省事写了 3650 天(10年),结果一年后想要换新证书时发现私钥目录忘了备份,整个重来。另外,自签名证书在 Chrome 里会报 NET::ERR_CERT_AUTHORITY_INVALID,你需要在浏览器里手动信任它。
4. 核心流程:一张图看懂
我画了一张图,把刚才讲到的全部串起来。你顺着箭头走一遍,就全明白了。
这张图的要点就是:私钥是根,CSR是中间件,证书是最终产物。不管是自签还是CA签发,私钥一定是你最先创造的。
5. 验证你的产出
生成完证书和私钥,你怎么知道它们对不对?我教你三条命令:
# 检查私钥是否完好
openssl rsa -in server.key -check -noout
# 检查证书信息
openssl x509 -in server.crt -text -noout | grep -E "Subject:|Issuer:|Not Before|Not After"
# 检查私钥和证书是否匹配(对比两者的模数)
openssl rsa -modulus -in server.key -noout | openssl md5
openssl x509 -modulus -in server.crt -noout | openssl md5
# 两个 md5 值必须完全一致
🔍 我的日常习惯:
每次换证书,我都先跑
每次换证书,我都先跑
openssl rsa -modulus 和 openssl x509 -modulus 比一下。不等号一出,立马知道是哪个环节出错,不用瞎猜。
6. 总结一张表
我把四个核心命令整理成一张表,方便你快速查阅。
| 目标 | 核心命令 | 关键参数 | 输出文件 |
|---|---|---|---|
| 生成 RSA 私钥 | genrsa |
2048 -aes256 -nodes |
.key |
| 生成 CSR | req -new |
-key -subj -out |
.csr |
| 自签名证书 | req -x509 |
-days 365 -nodes |
.crt |
| 验证匹配 | rsa -modulus + x509 -modulus |
-noout md5 |
控制台输出 |