在日常维护 Web 服务器、邮件服务器或开发 API 的过程中,处理 TLS 证书是必不可少的工作。无论是为新建服务生成私钥、向证书颁发机构(CA)提交证书签名请求(CSR),还是为测试环境快速创建自签名证书,OpenSSL 都能通过一个命令行工具完成所有需求。如果你经常与网络/系统打交道,掌握 OpenSSL 的基本用法会让运维工作事半功倍。
OpenSSL 是 Linux 系统上 TLS/SSL 协议的事实标准工具集,几乎预装在所有的 Linux 发行版中。它提供了数十个子命令,用于密钥生成、证书处理、格式转换和连接测试。
1. 基础语法与环境检查
OpenSSL 通过子命令工作,每个子命令带有不同的选项。
-
命令语法:
openssl 命令 [命令选项] [参数]
例如,openssl genrsa 用于生成 RSA 密钥,openssl x509 用于处理 X.509 证书。
-
查看所有子命令:
openssl help

-
检查版本:不同大版本间默认选项可能不同,建议先确认版本。当前主流发行版使用 OpenSSL 3.x 系列,下文示例均基于此版本。
openssl version
输出示例:
OpenSSL 3.5.5 27 Jan 2026
2. 生成私钥 (Private Key)
私钥是所有证书操作的基础,必须严格保密。
(1)生成 RSA 私钥:
-
未加密 (服务自动读取,推荐测试环境):
openssl genrsa -out private.key 2048
说明:2048 位是当前最低安全要求;若需更高安全性,可将 2048 换为 4096。
-
加密保护 (生产环境推荐):
openssl genrsa -aes256 -out private.key 2048
说明:系统会提示输入密码,服务启动时需要提供该密码。
(2)生成椭圆曲线 (EC) 私钥: 相比 RSA,EC 密钥更小、速度更快。以下命令使用广泛支持的 prime256v1 曲线:
openssl ecparam -name prime256v1 -genkey -noout -out ec-private.key
注意:
私钥属于核心机密。必须严格限制权限 (chmod 600 private.key),切勿提交到版本控制,并添加到 .gitignore 中。
3. 创建证书签名请求 (CSR)
CSR 包含公钥和组织信息,用于向 CA 申请签名证书。
-
交互式创建:同时生成密钥和 CSR,系统会提示填写主题字段。
openssl req -new -newkey rsa:2048 -noenc -keyout domain.key -out domain.csr
说明:-noenc 表示不加密私钥;Common Name (CN) 需填写主域名(如 example.com)。
-
非交互式创建:直接通过命令行指定所有信息,并添加“使用者可选名称 (SAN)”。
openssl req -new -newkey rsa:2048 -noenc \
-keyout domain.key -out domain.csr \
-subj "/C=US/ST=California/L=San Francisco/O=Example Inc/CN=example.com" \
-addext "subjectAltName=DNS:example.com,DNS:www.example.com"
-
检查 CSR 内容:提交前确认信息无误。
openssl req -in domain.csr -noout -text
4. 创建自签名证书 (Self-Signed Certificate)
适用于本地开发、内部测试等无需 CA 签名的场景。
-
一条命令生成密钥和证书 (有效期一年):
openssl req -x509 -newkey rsa:2048 -noenc \
-keyout selfsigned.key -out selfsigned.crt \
-days 365 \
-subj "/CN=localhost" \
-addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
说明:-x509 选项指示输出证书而非请求。浏览器会提示不安全,这属于正常现象。
-
注意:对于需要公网浏览器信任的网站,请使用 Let's Encrypt 等正规 CA 签发的证书。
5. 查看与验证证书
-
查看证书全部内容:
openssl x509 -in selfsigned.crt -noout -text
-
仅查看有效期:
openssl x509 -in selfsigned.crt -noout -dates
-
仅查看主题和颁发者:
openssl x509 -in selfsigned.crt -noout -subject -issuer
-
验证私钥、证书和 CSR 是否匹配: 三者公钥必须一致,否则服务无法启动。通过比对模数的 MD5 哈希值来验证:
openssl rsa -in domain.key -noout -modulus | openssl md5
openssl x509 -in domain.crt -noout -modulus | openssl md5
openssl req -in domain.csr -noout -modulus | openssl md5
说明:三条命令的输出哈希值必须完全相同。
6. 转换证书格式
不同平台要求不同编码格式。
-
PEM 转 DER (二进制格式,常用于 Java/Windows):
openssl x509 -in cert.pem -outform der -out cert.der
-
DER 转 PEM:
openssl x509 -in cert.der -inform der -outform pem -out cert.pem
-
导出 PKCS#12 文件 (.pfx 或 .p12,用于 Windows 服务/负载均衡器):
openssl pkcs12 -export -out bundle.pfx -inkey domain.key -in domain.crt
说明:系统会提示设置导出密码。
7. 测试 TLS 连接
使用 s_client 子命令快速调试远程服务器的证书。
-
基本测试:
openssl s_client -connect example.com:443
说明:输出证书链、协商的协议/加密套件和验证结果。按 Ctrl+C 或输入 Q 退出。
-
指定 SNI (服务器名称指示):当服务器上托管多个域名时,使用此选项获取正确的证书。
openssl s_client -connect example.com:443 -servername example.com
-
仅检查证书过期时间:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
8. 辅助功能:生成随机数据与哈希
9. 快速参考表
| 任务 |
命令 |
| 查看版本 |
openssl version |
| 生成 RSA 密钥 |
openssl genrsa -out private.key 2048 |
| 生成 EC 密钥 |
openssl ecparam -name prime256v1 -genkey -noout -out ec.key |
| 创建 CSR |
openssl req -new -newkey rsa:2048 -noenc -keyout d.key -out d.csr |
| 创建自签名证书 |
openssl req -x509 -newkey rsa:2048 -noenc -keyout d.key -out d.crt -days 365 |
| 查看证书 |
openssl x509 -in cert.crt -noout -text |
| 检查有效期 |
openssl x509 -in cert.crt -noout -dates |
| PEM 转 DER |
openssl x509 -in cert.pem -outform der -out cert.der |
| 导出 PKCS#12 |
openssl pkcs12 -export -out b.pfx -inkey d.key -in d.crt |
| 测试 TLS 连接 |
openssl s_client -connect host:443 -servername host |
10. 常见问题与解决方案
(1)无法加载私钥:
原因:密钥已加密但命令未提供密码。
解决:使用解密命令 openssl rsa -in encrypted.key -out plain.key,或重新生成未加密密钥。
(2)验证错误:num=18 自签名证书:
原因:正常现象,表示证书链末端是自签名证书。对于公开网站,请安装完整的 CA 证书链。
(3)验证错误:num=20 无法获取本地颁发者证书:
原因:服务器未发送中间证书。
解决:将你的证书与 CA 中间证书合并为一个文件并配置到服务器。
(4)密钥和证书模数不匹配:
原因:证书不是为该密钥签发的。
解决:请确认 CSR 和签名使用的是同一密钥对。
OpenSSL 功能强大,涵盖了从密钥生成、证书管理、格式转换到在线测试的全流程。如果想系统地积累这类运维知识,一份高质量的技术文档合集总能派上大用场。在日常实践中,请务必注意私钥的权限管理,并在生产环境使用受信任的 CA 签发的证书,同时建立证书到期自动提醒与续签机制,避免服务因证书过期而中断。
|