4、OpenSSL工具入门:安装、查看证书、生成自签名证书

说到接口适配中的证书链问题,OpenSSL 绝对是个绕不开的工具。我个人习惯把它叫做「证书界的瑞士军刀」——虽然命令行参数有点多,但用熟了之后,你会发现它几乎能搞定所有跟证书、密钥、加密相关的活儿。

这一章,咱们就从头捋一遍。怎么装、怎么看证书、怎么自己签一个证书出来。嗯,这些基础打牢了,后面讲证书链验证的时候你才不会懵。

4.1 安装 OpenSSL:不同平台怎么搞

OpenSSL 的安装其实不复杂,但不同系统差别还挺大。我最早在 Windows 上折腾的时候,被各种 DLL 缺失坑过好几次。

Linux(Ubuntu / CentOS)

Linux 用户最幸福,基本都预装了。没装的话,一行命令搞定:

# Ubuntu / Debian
sudo apt-get install openssl

# CentOS / RHEL
sudo yum install openssl

装完验证一下版本:

openssl version

你会看到类似 OpenSSL 1.1.1k 25 Mar 2021 的输出。我个人建议用 1.1.1 以上版本,3.0 更好,因为支持更多加密套件。

macOS

macOS 自带的 LibreSSL 跟 OpenSSL 不完全兼容。我踩过这个坑——用 openssl version 一看,输出的是 LibreSSL,有些参数不支持。解决办法是用 Homebrew 装一份真正的 OpenSSL:

brew install openssl

# 然后加到 PATH
echo 'export PATH="/usr/local/opt/openssl@3/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

Windows

Windows 用户可以去 slproweb.com/products/Win32OpenSSL.html 下载安装包。记得选 Win64 OpenSSL v3.x.x 版本,安装时勾上「Copy OpenSSL DLLs to /bin directory」。装完后把 C:\Program Files\OpenSSL-Win64\bin 加到系统环境变量里。

我的小技巧: 装完后在命令行敲 openssl version -a,能看到编译参数和安装路径。如果报错说找不到 DLL,八成是环境变量没配好,或者缺了 Visual C++ 运行库。

4.2 查看证书:从文件里读信息

拿到一个证书文件,第一件事就是看里面到底写了啥。OpenSSL 提供了几个常用命令,我几乎每天都会用到。

查看 PEM 格式证书

最常见的证书格式是 PEM(Base64 编码,以 -----BEGIN CERTIFICATE----- 开头)。查看命令很简单:

openssl x509 -in server.crt -text -noout

输出内容很长,核心信息包括:

  • Subject:证书持有者,比如 CN=example.com
  • Issuer:签发者,也就是上级 CA
  • Validity:有效期,Not Before 和 Not After
  • Subject Public Key Info:公钥算法和长度
  • X509v3 extensions:扩展字段,比如 SAN(Subject Alternative Name)

有一次我在排查接口适配问题,发现证书明明没过期,但客户端就是报错。后来用这个命令一看,SAN 字段里没有配 IP 地址,只有域名。客户端用 IP 访问,自然校验失败。

重点: 查看证书时,-noout 参数表示不输出证书本身的 Base64 内容,只显示解析后的文本。不加这个参数,你会看到两段内容混在一起,很乱。

查看 DER 格式证书

DER 是二进制格式,Windows 下常见。查看时需要加 -inform DER:

openssl x509 -in server.der -inform DER -text -noout

查看证书链文件

有时候你会拿到一个包含多级证书的链文件(比如 chain.pem)。用下面这个命令可以拆开看每一级:

openssl crl2pkcs7 -nocrl -certfile chain.pem | openssl pkcs7 -print_certs -text -noout

或者更直接一点,用 openssl storeutl(OpenSSL 1.1.1+ 支持):

openssl storeutl -text -noout chain.pem

这个命令会按顺序列出链里的每一张证书,包括它们的 Subject、Issuer 和有效期。我在做证书链校验时,经常用它来确认链的顺序对不对。

4.3 生成自签名证书:从零到一

自签名证书,说白了就是自己给自己当 CA。开发环境、内网测试、接口联调时特别常用。我几乎每个项目都会在本地生成一套,用来模拟生产环境的证书链。

第一步:生成私钥

先搞一把私钥出来。推荐用 RSA 2048 位或 ECC(椭圆曲线):

# RSA 私钥
openssl genrsa -out server.key 2048

# ECC 私钥(更推荐,性能更好)
openssl ecparam -genkey -name prime256v1 -out server.key

我个人偏好 ECC,因为密钥短、速度快。但有些老旧系统只支持 RSA,这个得看对接方的要求。

第二步:生成证书签名请求(CSR)

有了私钥,下一步是生成 CSR。CSR 里包含你的公钥和身份信息:

openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=Dev/CN=localhost"

参数说明:

字段 含义 示例
C 国家 CN
ST 省份 Beijing
L 城市 Beijing
O 组织 MyCompany
CN 通用名称(域名或IP) localhost
注意: CN 字段必须填客户端实际访问的域名或 IP。如果填了 localhost,但客户端用 127.0.0.1 访问,证书校验会失败。我见过有人因为这个折腾了一下午。

第三步:自签名证书

用私钥和 CSR 给自己签发证书:

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

这个命令会生成一个有效期为 365 天的自签名证书。但有个问题——它没有 SAN 扩展。现代浏览器和很多客户端都要求 SAN 字段,否则会报安全警告。

所以,更推荐的做法是写一个配置文件:

# server.cnf
[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
C = CN
ST = Beijing
L = Beijing
O = MyCompany
OU = Dev
CN = localhost

[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
DNS.2 = example.com
IP.1 = 127.0.0.1
IP.2 = 192.168.1.100

然后用配置文件生成证书:

openssl req -x509 -new -nodes -key server.key -sha256 -days 365 -config server.cnf -out server.crt

这样生成的证书,SAN 字段里包含了域名和 IP,客户端怎么访问都能通过校验。

4.4 知识体系总览

下面这张图把 OpenSSL 的核心操作串起来了。你跟着这个流程走,基本能覆盖日常 90% 的需求:

OpenSSL 核心操作流程图 OpenSSL 核心操作流程 安装 OpenSSL 生成私钥 查看证书 生成 CSR 自签名证书 证书 + 私钥 验证证书链 说明:查看证书和生成证书是两条独立路径,但最终都要落到验证环节

4.5 常用命令速查表

我把平时最常用的几个命令整理成了表格,方便你快速查阅:

操作 命令 说明
查看 PEM 证书 openssl x509 -in cert.pem -text -noout 最常用,解析证书全部字段
查看 DER 证书 openssl x509 -in cert.der -inform DER -text -noout Windows 导出的证书常用 DER 格式
查看证书链 openssl storeutl -text -noout chain.pem 按顺序列出链中所有证书
生成 RSA 私钥 openssl genrsa -out key.pem 2048 2048 位是当前最低安全标准
生成 ECC 私钥 openssl ecparam -genkey -name prime256v1 -out key.pem 推荐使用,性能更好
生成 CSR openssl req -new -key key.pem -out csr.pem -subj "/CN=test" 提交给 CA 签名用
自签名证书 openssl req -x509 -new -key key.pem -days 365 -out cert.pem 开发测试环境专用
带 SAN 自签名 openssl req -x509 -new -key key.pem -config config.cnf -out cert.pem 生产级自签名,推荐使用
我的习惯: 每次生成证书后,我都会用 openssl verify -CAfile ca.pem server.crt 验证一遍。虽然自签名证书自己验证自己肯定能过,但这个习惯能帮你提前发现格式问题。我曾经因为证书里多了一个空行,导致 Java 客户端解析失败,查了半天才发现。

4.6 避坑指南

最后分享几个我踩过的坑,你遇到了可以直接跳过:

  • 私钥权限:私钥文件一定要设置 600 权限。我见过有人把私钥设成 644,结果被 CI 工具扫出来,安全审计直接挂了。
  • 证书格式混淆:PEM 和 DER 别搞混。很多工具只认 PEM,如果你拿到的是 DER,用 openssl x509 -in cert.der -inform DER -out cert.pem 转一下。
  • SAN 缺失:Chrome 58 之后强制要求 SAN 字段。没有 SAN 的自签名证书,浏览器会直接拦截,连「继续访问」的选项都不给。
  • 有效期别设太长:自签名证书设 365 天就够了。设个 10 年,万一私钥泄露,后果很严重。

嗯,OpenSSL 入门就这些。工具装好、命令练熟,后面讲证书链验证的时候,你就能直接上手实操了。