letsencrypt生成的chain.pem,fullchain.pem,cert.pem各有什么作用?

这个问题很关键,很多人第一次用 Let’s Encrypt 时都容易混淆。下面我详细讲清楚
cert.pem

chain.pem

fullchain.pem
三者的区别、作用,以及在 Nginx、Apache等不同场景下该用哪一个。


🧩 一、Let’s Encrypt 生成的主要证书文件


/etc/letsencrypt/live/<你的域名>/
目录下,通常会有以下四个文件:

文件名 含义 内容类型 主要用途

privkey.pem
私钥(Private Key) 你的网站私钥,只能自己保存,绝不能泄露 服务器端用于 TLS 握手时证明身份

cert.pem
域名证书(End-entity Certificate) 你的域名对应的单独证书 包含你的公钥和域名信息,由 Let’s Encrypt 签发

chain.pem
中间证书链(Intermediate Certificate) Let’s Encrypt 的中间 CA 证书 用于让客户端验证你的证书链完整性

fullchain.pem
完整证书链(Full Certificate Chain)
cert.pem
+
chain.pem
合并后的文件
大多数服务器推荐直接使用这个文件

🧠 二、各文件的内部结构区别

以命令行查看为例:



# 查看 cert.pem 内容(只含你的域名证书)
openssl x509 -in cert.pem -noout -subject -issuer
 
# 查看 chain.pem 内容(中间 CA 证书)
openssl x509 -in chain.pem -noout -subject -issuer
 
# 查看 fullchain.pem 内容(两者合并)
cat fullchain.pem

可以看到:



-----BEGIN CERTIFICATE-----
(你的域名证书)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Let’s Encrypt 中间CA证书)
-----END CERTIFICATE-----

也就是说,
fullchain.pem
只是
cert.pem
+
chain.pem
拼在一起。


⚙️ 三、各类程序的使用区别

✅ Nginx



ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

Nginx 需要完整证书链,因此必须用
fullchain.pem


✅ Apache



SSLCertificateFile      /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile   /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

Apache 早期版本需分开指定;新版 (>=2.4.8) 可直接使用
fullchain.pem


✅ stunnel



cert = /etc/letsencrypt/live/example.com/fullchain.pem
key  = /etc/letsencrypt/live/example.com/privkey.pem

stunnel 同样要求完整证书链,因此应使用
fullchain.pem
而不是
cert.pem


✅ 其他安全应用

这些自定义 TLS 封装程序内部通常调用 OpenSSL:



--tls-certificate /etc/letsencrypt/live/example.com/fullchain.pem 
--tls-private-key /etc/letsencrypt/live/example.com/privkey.pem

一样用
fullchain.pem
,因为客户端需要验证完整链。


🧰 四、
chain.pem
的特殊用处

某些系统或客户端(例如 Java Keystore、curl、部分嵌入式设备)只接受中间证书单独导入;

如果你要生成
ca-bundle.crt

.p7b
格式,可用
chain.pem
作为中间链输入;

若要验证完整链是否正确,可执行:


penssl verify -CAfile chain.pem cert.pem 

✅ 五、总结表格

文件 包含内容 是否包含中间证书 通常用在

cert.pem
仅你域名的公钥证书 Apache(旧版)

chain.pem
中间CA证书 ✅(仅中间) Java、curl导入

fullchain.pem
cert.pem + chain.pem Nginx、stunnel、wstunnel 等

privkey.pem
私钥 所有服务器端

💡说明

此图展示了:

浏览器(客户端)服务器 fullchain.pemLet’s Encrypt 中间 CA根 CA(系统信任库) 的完整信任链验证流程。


fullchain.pem
是最常用于配置的文件,因为它一次性包含了服务器证书与中间链。


privkey.pem
绝不共享,只在服务器本地使用,与证书链配合完成握手签名。

下面是完整的 TLS 握手序列图
可清晰展示
privkey.pem

cert.pem

chain.pem

fullchain.pem
在握手过程中的作用与数据流。

🧩 图中关键点说明

步骤 说明 涉及文件
ClientHello / ServerHello 建立连接参数(TLS版本、算法等)
Certificate 服务器发出
fullchain.pem
(即 cert.pem + chain.pem)
签名验证 客户端用中间CA、根CA验证证书合法性 chain.pem
私钥签名 服务器用
privkey.pem
对握手消息签名
privkey.pem
握手完成 双方生成会话密钥,后续数据加密传输
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容