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 |
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% 的需求:
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 入门就这些。工具装好、命令练熟,后面讲证书链验证的时候,你就能直接上手实操了。