×

SSL证书格式大乱斗——从 Nginx 到 IIS,一篇就够用

hqy hqy 发表于2025-11-03 22:58:37 浏览12 评论0

抢沙发发表评论

摘自 https://www.hqyman.cn/post/16247.html 

?《SSL 证书格式大乱斗》

—— 从 Nginx 到 IIS,一篇就够用

先放结论:
Linux 系爱 PEM,Windows 系爱 PFX;Java 老项目 JKS,CDN 啥都能吃。


1️⃣ 为什么“格式”总被拎出来吊打?

SSL/TLS 只是“协议”,真正的“身份证”是 X.509 证书
同一张身份证,可以做成不同“封装”:


封装名
人类可读
含私钥
典型后缀
一句话记忆
PEM
可选
.pem
 .crt .key
打开满屏 -BEGIN-
DER
可选
.der
 .cer
二进制,打不开
PFX/PKCS#12
.pfx
 .p12
双击要密码
P7B/PKCS#7
.p7b
 .p8
只能装“公家”证书
JKS
.jks
Java 私藏小仓库



2️⃣ Web 代理全家福

下面把“常见代理/CDN/反向代理”按出场频率排个序,告诉你他们吃哪口饭。


代理/服务器
最爱格式
私钥放哪
证书链要求
热更新姿势
备注
Nginx
PEM
单独 .key
中级链贴后面
nginx -s reload
全宇宙最多
Apache httpd
PEM
单独 .key
同 Nginx
apachectl graceful
指令不同而已
HAProxy
单文件 PEM
合并
一起合
socat
 动态刷
1.5+ 才原生 SSL
Traefik
PEM
K8s Secret
自动补链
监听文件即生效
云原生小甜甜
Envoy
PEM
单文件
手动拼
热备文件+信号
Lyft 出品,Service Mesh 标配
Caddy
PEM
自动 Let’s Encrypt
全自动
零配置
懒人神器
IIS
PFX
导入系统
自动补链
图形界面→绑定
Windows 官配
Tomcat/Java
PFX 或 JKS
包里面
手动导
重启 JVM
老项目 JKS 多
OpenResty
PEM
同 Nginx
同 Nginx
lua-resty-core
 热载
带 Lua 的 Nginx
CDN(阿里/腾讯/Cloudflare)
PEM
控制台粘贴
自动补链
0 部署
上传后 2-3 min 全球生效



3️⃣ 一张流程图:流量到底在哪解密?

浏览器 ──HTTPS──▶  CDN/边缘节点  ──HTTP──▶  源站
           ▲                              ▲
           │ 证书装在边缘                  │ 源站可裸跑 80
           └────── 用户看到的小锁在这里 ───────┘

只要“小锁”出现的位置,就必须放证书;后面走 HTTP 也没人管。


4️⃣ 格式互转 5 条命令(复制即用)

  1. 1. PFX → PEM(拆钥匙)
    openssl pkcs12 -in full.pfx -nocerts -nodes -out private.key
    openssl pkcs12 -in full.pfx -clcerts -nokeys -out cert.crt
    openssl pkcs12 -in full.pfx -cacerts -nokeys -out chain.crt
  2. 2. PEM → PFX(合大包)
    openssl pkcs12 -export -out full.pfx -inkey private.key -in cert.crt -certfile chain.crt
  3. 3. PEM → DER(给路由器/AP)
    openssl x509 -in cert.crt -outform der -out cert.der
  4. 4. 查看 PEM 里装了啥
    openssl crl2pkcs7 -nocrl -certfile cert.crt | openssl pkcs7 -print_certs -text -noout
  5. 5. 查看 PFX 里装了啥
    openssl pkcs12 -info -in full.pfx -nodes

5️⃣ 高频踩坑 9 连击


症状
真凶
秒解
Nginx 启动报 “key values mismatch”
证书与私钥不配
`openssl x509 -noout -modulus -in cert.crt
安卓 7 报证书无效
缺中间链
把中级证书贴自己证书后面
iOS 秒过,Win7 失败
用了 ECC 证书
老系统换 RSA 2048
HAProxy 报 “no private key found”
PEM 里没私钥
把 -----BEGIN PRIVATE KEY----- 段落粘进去
Tomcat 换证书要重启?
传统 JSSE
换 APR 原生库即可热载
CDN 上传后还是“不安全”
链顺序反了
先叶子→再中级→再根
Let’s Encrypt 通配符申请失败
没用 DNS 验证
上 acme.sh --dns 钩子
Caddy 自动续失败
80 端口被占
先关 Nginx,续完再开
证书还有 30 天过期
忘记加定时
crontab -e
 每月跑 certbot renew --quiet



6️⃣ 面试常问 3 连

Q1:RSA 与 ECC 证书怎么选?

  • • 老设备兼容选 RSA 2048
  • • 新系统、追求小握手包选 ECC 256(secp256r1)

Q2:域名改了,原证书还能用吗?

  • • 证书绑定 CN/SAN,改域名必须重签,无“改名”操作。

Q3:双向 TLS(mTLS)怎么玩?

  • • 服务端仍装原证书
  • • 另建自签 CA → 给客户端签客户端证书
  • • Nginx 加 ssl_verify_client on; ssl_client_certificate ca.crt;

7️⃣ 懒人工具清单


场景
工具
一句话
本地快速自签
mkcert
一行命令生成本地受信任证书
批量检查过期
ssl-checker
 npm 包
读域名列表,到期邮件飞书告警
图形化看链
`openssl s_client -connect domain:443 -servername domain -showcerts
openssl x509 -text
在线转格式
https://www.sslshopper.com/ssl-converter.html
应急用,生产别上传私钥
自动续 Let’s Encrypt
acme.sh
 / certbot
一个 Shell 一个 Python,随你口味



8️⃣ 小结思维导图(文字版)

SSL 证书
├─ 格式:PEM / DER / PFX / JKS
├─ 链:叶子→中级→根
├─ 私钥:RSA2048 / ECC256
└─ 部署层:CDN → 网关 → 源站

记住四步:
“拆包→拼链→对号入座→定时续期”
下次再配证书,3 分钟搞定,早下班不香吗?


打赏

本文链接:https://kinber.cn/post/5819.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客