找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

5478

积分

0

好友

738

主题
发表于 2 小时前 | 查看: 5| 回复: 0

在日常维护 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 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. 辅助功能:生成随机数据与哈希

  • 生成随机令牌 (URL 安全):

    openssl rand -base64 32
  • 计算文件 SHA-256 哈希

    openssl dgst -sha256 file.iso

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 签发的证书,同时建立证书到期自动提醒与续签机制,避免服务因证书过期而中断。




上一篇:物理AI如何驱动自动驾驶商业化:技术栈拆解与现状研判
下一篇:Kimi Work知识管理教程:一键将手机相册截图转成可检索知识库
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-6-9 23:18 , Processed in 0.970365 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表