2. 证书管理基础:SSL/TLS协议简介、证书类型与格式
这一章,我们来聊聊证书管理的基础知识。说白了,就是你要搞懂三个东西:SSL/TLS 是什么玩意儿,证书有哪些种类,以及它们到底以什么格式存在。我个人习惯把这些搞清楚了再动手配置,否则后面遇到问题你都不知道错在哪。
我记得刚开始做 API 网关的时候,最头疼的其实就是证书配置。明明按照文档一步步来,浏览器就是提示不安全。后来才发现,是对证书类型和格式的理解出了问题。嗯,这节课我们就来把这几个基础打扎实。
---2.1 SSL/TLS 协议:到底在保护什么?
SSL/TLS 协议,说白了就是给网络通信加了一把锁。你在浏览器上看到的那个小锁图标,就是它干的活。
它的核心使命有三个:
- 加密:数据传输过程中,别人偷看也看不懂
- 身份验证:确保你连接的是真正的服务器,不是假货
- 数据完整性:传输过程中没被人篡改过
为什么会这样?因为 HTTP 协议本身就是明文的。我在项目中遇到过不少开发同学以为加了 HTTPS 就万事大吉,但实际上 TLS 版本、加密套件配置不当,照样有漏洞。比如旧版的 TLS 1.0/1.1,现在基本都被禁用掉了。
TLS 握手过程大致是这样:
- 客户端发起 "ClientHello",带上支持的 TLS 版本和加密套件列表
- 服务器回应 "ServerHello",选一个双方都支持的版本和套件
- 服务器发送证书(就是咱们这章的重点)
- 客户端验证证书的有效性
- 双方协商出会话密钥,后续通信全部加密
小提示:我在做 API 网关性能调优时发现,TLS 握手是性能瓶颈之一。能开启会话复用(Session Resumption)就尽量开启,可以省掉一次完整握手。
2.2 证书类型:自签名 vs CA 签发
你想想看,你凭什么相信一张证书?要么它自己发的,要么找了一个大家都信的权威机构来发。
这就引出了两种主要证书类型:
2.2.1 自签名证书
自己给自己签发证书,没人给你做背书。说白了,你自己说 “我是我”。
- 适用场景:开发环境、内网测试、个人项目
- 优点:免费、生成快、完全可控
- 缺点:浏览器不信任,会弹出安全警告
实战经验:我在本地开发 API 网关时,全部用自签名证书。用一个 openssl 命令几秒钟就生成了,完全够用。但注意:生产环境千万别这么干!
2.2.2 CA 签发证书
CA(Certificate Authority,证书颁发机构)是大家都信任的第三方。你拿着一堆证明材料去找它,它审核通过后给你签发证书。浏览器、操作系统里预装了这些 CA 的根证书,所以它们签发的证书会被自动信任。
- 适用场景:生产环境、对外服务、公网 API
- 优点:浏览器信任、用户无感知
- 缺点:通常需要付费(Let's Encrypt 免费的除外)
避坑指南:我曾经在生产环境中误用了自签名证书,结果客户所有客户端都报证书错误。折腾了大半天才找到原因。切记:生产环境一定要用 CA 签发的证书!
2.3 证书格式:PEM、DER、PFX
这部分经常让人头大。同样是证书文件,为什么有的后缀是 .pem,有的是 .crt,还有的是 .pfx?
其实它们只是不同的编码和封装方式。我整理了一个表格,方便你对照:
| 格式 | 编码方式 | 文件内容 | 常见后缀 | 适用场景 |
|---|---|---|---|---|
| PEM | Base64 文本 | 可包含证书、私钥、CA 链 | .pem, .crt, .key | Nginx, Apache, Linux 平台 |
| DER | 二进制 | 通常只包含单个证书 | .der, .cer | Java、Windows 平台 |
| PFX/P12 | 二进制(PKCS#12 格式) | 证书 + 私钥打包在一起 | .pfx, .p12 | Windows、IIS、导入导出 |
我来解释一下这几个格式的实际操作:
2.3.1 PEM 格式
PEM 是纯文本格式,以 -----BEGIN CERTIFICATE----- 开头。你可以用记事本直接打开看。这也是最常用的格式,尤其在 Linux 和 Nginx 环境里。
-----BEGIN CERTIFICATE-----
MIIDazCCAlMCFAjxR0mJ1rTz2...
-----END CERTIFICATE-----
PEM 也可以包含私钥:
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQE...
-----END PRIVATE KEY-----
经验之谈:我配置 API 网关时,最喜欢用 PEM 格式。因为它可读性强,方便调试。而且 OpenSSL 默认输出的就是 PEM。
2.3.2 DER 格式
DER 是二进制格式,不能直接用文本编辑器看。它是 PEM 的二进制版本,内容完全一样,但更紧凑。Java 的 keytool 默认导入导出就是 DER 格式。
通常我们得做转换。比如把 DER 转成 PEM:
openssl x509 -inform der -in certificate.der -out certificate.pem
2.3.3 PFX/P12 格式
PFX(也叫 PKCS#12)是一种容器格式,把证书和私钥打包在一起,还加了密码保护。Windows 平台上特别常见。
我举个例子,导出 PFX:
openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.pfx
注意:PFX 文件有密码保护,这个密码可千万别丢了。我曾经有个同事把 PFX 密码忘了,最后只能重新申请证书,耽误了上线时间。
2.4 如何在 API 网关中选对格式?
不同的 API 网关,对证书格式的要求不太一样。我总结了几个常见网关的偏好:
| 网关产品 | 推荐格式 | 备注 |
|---|---|---|
| Nginx / OpenResty | PEM | 证书和私钥分开两个文件 |
| Kong | PEM | 支持证书和私钥合并到一个文件 |
| Spring Cloud Gateway | PKCS12 (PFX) | Java 应用首选 PFX 或 JKS |
| API Gateway (AWS) | PEM | 通过 ACM 管理 |
| Azure API Management | PFX | 需上传包含私钥的 PFX |
我的建议:如果不确定该用什么格式,一律用 PEM。因为 OpenSSL 随手就能转成其他格式。而且 PEM 是文本文件,出错时容易排查。当然,Java 系的应用除外,用 PFX 会省很多麻烦。
2.5 格式转换实战:一条命令搞定
这块内容比较实践向,我把我平时最常用的几个命令分享给你:
-
PEM 转 DER:
openssl x509 -in cert.pem -outform der -out cert.der -
DER 转 PEM:
openssl x509 -inform der -in cert.der -out cert.pem -
PEM 转 PFX:
openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.pfx -
从 PFX 中提取 PEM 证书:
openssl pkcs12 -in cert.pfx -nokeys -out cert.pem -
从 PFX 中提取私钥(PEM 格式):
openssl pkcs12 -in cert.pfx -nocerts -nodes -out key.pem
安全警告:私钥一定要妥善保管。我见过有人把私钥上传到公开的代码仓库,几分钟后就被扫到了,后果不堪设想。记住:私钥是唯一能证明你身份的东西。
这一章的内容讲到这里就差不多了。SSL/TLS 协议搞清楚了,证书类型和格式也分清了,接下来你就可以动手配置真正的 API 网关证书了。别着急,先从开发环境用自签名 PEM 练手,等熟练了再上生产环境的 CA 签发证书。