在Kubernetes、Traefik、Ingress-Nginx场景中,Let's Encrypt(LE) 是最主流免费CA;很多人混淆三件事:证书签发、HTTPS加密、HTTP/2协议。
HTTPS = HTTP over TLS,必须依赖证书;HTTP/2 是传输层之上的应用层协议 ,HTTP/2 推荐强制搭配HTTPS(浏览器只支持加密环境下的HTTP/2),但证书本身不代表开启HTTP/2。
核心概念总览表
| 名词 | 核心作用 | 依赖关系 | 关键要点 |
|---|---|---|---|
| Let's Encrypt | 免费证书颁发机构(CA),签发TLS证书 | 域名所有权验证(HTTP01/DNS01/TLS-ALPN01) | 证书有效期90天;公网IP证书仅6天,内网IP无法申请 |
| TLS证书 | 用于身份认证+流量加密,HTTPS的基础载体 | CA签发(LE/自签名/商业证书) | 证书包含域名/IP、公钥、有效期、签名;没有证书无法启用HTTPS |
| HTTPS | HTTP协议 + TLS加密隧道 | 必须配置有效的TLS证书 | 443端口;流量加密防窃听、中间人劫持;浏览器安全锁标识 |
| HTTP/2 | 新一代HTTP应用协议,解决HTTP/1.1队头阻塞 | 必须基于HTTPS(浏览器限制),TLS证书只是前置条件,证书本身不会自动开启HTTP/2 | 多路复用、头部压缩、服务器推送;证书和HTTP/2是独立开关 |
一句话总结:LE负责颁发证书;证书是HTTPS的必要条件;HTTPS是浏览器环境启用HTTP/2的必要条件;拿到LE证书≠自动开启HTTP/2,需要在反向代理(Traefik/Nginx)单独开启协议开关。
一、Let's Encrypt 证书:申请原理、验证方式对比
LE不会随便签发证书,必须证明你拥有该域名所有权,3种验证方式:
| 验证类型 | 适用场景 | 端口要求 | 优点 | 缺点 |
|---|---|---|---|---|
| HTTP-01 | 普通网站、Ingress,最常用 | 80端口开放,公网可达 | 配置简单;无需DNS权限;Traefik/cert-manager原生支持 | 80端口必须暴露;域名必须公网解析;防火墙/安全组不能拦截80 |
| DNS-01 | 泛域名证书、内网域名、80端口不可用场景 | 不需要开放80/443端口 | 可申请*.xxx.com泛域名;可用于内网解析域名 |
需要DNS服务商API权限;部分小众DNS不支持;需要授权修改DNS记录 |
| TLS-ALPN-01 | 公网IP证书场景 | 443端口开放 | 用于LE公网IP证书 | 仅支持公网IP;证书有效期只有6天;客户端版本要求高 |
LE证书核心限制清单
- 证书有效期 90天,必须自动续期,手动维护极易过期;
- 每周/单域名签发有速率限制,频繁删除重申请会被限流;
- 内网私有IP(10.x/192.168.x)不能申请LE证书;
- LE根证书主流浏览器/操作系统内置,无需手动导入(自签名证书需要);
- LE证书只做身份加密,不提升网站性能;性能优化来自HTTP/2。
二、HTTPS 和证书的关系
HTTPS本质:HTTP报文包裹在TLS加密隧道中传输。 完整握手流程:
- 客户端访问443端口;
- 服务端返回LE证书;
- 客户端校验证书签名、域名、有效期;
- 校验通过,协商TLS加密套件,建立加密隧道;
- 传输HTTP报文。
❌ 误区1:有域名就能拿到LE证书。→ 需要域名所有权验证,域名必须解析到你的服务并且满足验证端口条件。❌ 误区2:配置证书=开启HTTP/2。→ 错误。证书只负责TLS加密;HTTP/2是独立协议,需要反向代理单独开启。
三、HTTP/2 全景解析:收益、约束、协议对比
| 协议 | 传输环境 | 核心优势 | 短板 |
|---|---|---|---|
| HTTP/1.1 | HTTP / HTTPS | 兼容性最强 | 队头阻塞;多请求需要多TCP连接;请求头冗余 |
| HTTP/2 | 仅HTTPS(浏览器强制),服务端可支持明文h2c | 多路复用(单TCP并发多请求);HPACK头部压缩;二进制帧;服务端推送 | 老旧客户端兼容差;TCP层面依然存在队头阻塞(HTTP/3解决) |
| HTTP/3 | HTTPS(QUIC UDP) | UDP多路复用,彻底解决TCP队头阻塞 | UDP防火墙容易拦截;生态成熟度低于HTTP/2 |
HTTP/2 关键要点
- 浏览器强制:HTTP/2只能跑在HTTPS上;裸HTTP无法使用HTTP/2;
- 服务端Nginx/Traefik支持明文h2c,但是Chrome、Firefox浏览器不支持h2c;生产Web场景全部走HTTPS + h2;
- HTTP/2是后端代理的开关,和证书本身无关:同样一份LE证书,Nginx可以选择启用HTTP/1.1或者HTTP/2;
- HTTP/2 适合前端静态资源多、页面请求数量多的场景(你的yudao-ui-admin前端项目非常适合开启HTTP/2)。
四、Traefik 配置LE证书 + HTTPS + HTTP/2(K8s)
Traefik内置ACME客户端,不需要cert-manager,一键申请LE证书、自动续期、HTTP跳转HTTPS、开启HTTP/2。
4.1 Traefik Static Config(全局配置,开启ACME与HTTP/2)
# traefik static config
entryPoints:
web:
address: ":80"
http:
middlewares:
- https-redirect@internal # http自动跳转https
websecure:
address: ":443"
http:
tls: {}
serversTransport:
maxIdleConnsPerHost: 100
# ✅ 开启HTTP/2
http2:
enabled: true
certificatesResolvers:
letsencrypt:
acme:
email: test@demo.com
storage: /acme.json
httpChallenge:
entryPoint: web # 使用HTTP-01验证,占用80端口
4.2 IngressRoute 业务路由配置(Jenkins示例)
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: jenkins-ingressroute
namespace: jenkins
spec:
entryPoints:
- websecure
routes:
- match: Host(`jenkins.demo.com`)
kind: Rule
services:
- name: jenkins
port: 8080
tls:
certResolver: letsencrypt # 使用LE自动签发证书
配置生效之后:
- Traefik自动向Let's Encrypt发起域名所有权验证;
- 自动下载证书,存储在acme.json;到期自动续期;
- 80端口访问自动跳转443 HTTPS;
- 443端口同时支持 TLS + HTTP/2协议。
五、Ingress-Nginx 配置LE证书 + HTTPS + HTTP/2(K8s)
Ingress-Nginx没有内置ACME ,需要搭配 cert-manager 组件申请和管理LE证书。
5.1 cert-manager ClusterIssuer(LE签发器)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: [https://acme-v02.api.letsencrypt.org/directory](https://acme-v02.api.letsencrypt.org/directory)
email: test@demo.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
5.2 Ingress资源(开启HTTP/2)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: jenkins-ingress
namespace: jenkins
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "true" # http强制跳转https
nginx.ingress.kubernetes.io/http2-enabled: "true" # ✅开启HTTP/2
spec:
tls:
- hosts:
- jenkins.demo.com
secretName: jenkins-tls-cert # cert-manager自动创建,存放LE证书
rules:
- host: jenkins.demo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: jenkins
port:
number: 8080
六、常见踩坑汇总表
| 现象 | 根因 | 解决方案 |
|---|---|---|
| 浏览器HTTPS访问正常,但抓包看到协议是HTTP/1.1 | 反向代理没有开启HTTP/2开关;或者客户端不支持HTTP/2 | Traefik开启http2.enabled=true;Nginx ingress增加注解开启http2 |
| LE证书签发失败,报403 | HTTP01验证:80端口无法公网访问;域名解析错误;防火墙拦截80 | 检查域名A记录、安全组,放行80端口;改用DNS01验证 |
| 证书到期忘记更新,网站证书失效 | LE证书90天有效期,未配置自动续期 | Traefik内置自动续期;cert-manager自动续期;不要手动申请维护 |
| 内网IP 10.43.136.9尝试申请LE证书 | LE不支持内网私有IP签发证书 | 使用域名+公网入口,或者自建私有CA签发自签名证书 |
| HTTPS页面加载成功,但部分静态资源报错mixed-content | 页面内写死http资源地址 | 前端代码全部改成相对路径或者https资源 |
七、选型决策表
| 需求场景 | 推荐方案 |
|---|---|
| K8s集群,希望少组件,自动证书,快速上线 | Traefik内置ACME,LE证书,开启HTTP/2 |
| 存量大量Nginx配置,熟悉Ingress-Nginx | Ingress-Nginx + cert-manager + LE证书,开启HTTP/2 |
| 内网服务,无公网域名、无公网IP | 自建私有CA签发证书,不使用Let's Encrypt |
需要泛域名证书 *.demo.com |
LE DNS-01验证方式 |
| 前端Vue项目(yudao-ui-admin)公网部署 | HTTPS + HTTP/2,静态资源加速收益明显 |
总结
- Let's Encrypt 是证书颁发方,只负责签发TLS证书;证书是HTTPS的基础;
- HTTPS = TLS加密 + HTTP,用来保障传输安全;
- HTTP/2 是应用层协议优化,依赖HTTPS(浏览器限制),但是证书不会自动开启HTTP/2,需要反向代理单独配置开关;
- 在K8s体系:Traefik自带ACME,不用cert-manager;Ingress-Nginx必须搭配cert-manager管理LE证书;两种Ingress都支持一键开启HTTP/2。