服务器运维:Let’s Encrypt 证书 + HTTPS + HTTP/2 全景分析

在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证书核心限制清单

  1. 证书有效期 90天,必须自动续期,手动维护极易过期;
  2. 每周/单域名签发有速率限制,频繁删除重申请会被限流;
  3. 内网私有IP(10.x/192.168.x)不能申请LE证书
  4. LE根证书主流浏览器/操作系统内置,无需手动导入(自签名证书需要);
  5. LE证书只做身份加密,不提升网站性能;性能优化来自HTTP/2

二、HTTPS 和证书的关系

HTTPS本质:HTTP报文包裹在TLS加密隧道中传输。 完整握手流程:

  1. 客户端访问443端口;
  2. 服务端返回LE证书;
  3. 客户端校验证书签名、域名、有效期;
  4. 校验通过,协商TLS加密套件,建立加密隧道;
  5. 传输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 关键要点

  1. 浏览器强制:HTTP/2只能跑在HTTPS上;裸HTTP无法使用HTTP/2;
  2. 服务端Nginx/Traefik支持明文h2c,但是Chrome、Firefox浏览器不支持h2c;生产Web场景全部走HTTPS + h2;
  3. HTTP/2是后端代理的开关,和证书本身无关:同样一份LE证书,Nginx可以选择启用HTTP/1.1或者HTTP/2;
  4. 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自动签发证书

配置生效之后:

  1. Traefik自动向Let's Encrypt发起域名所有权验证;
  2. 自动下载证书,存储在acme.json;到期自动续期;
  3. 80端口访问自动跳转443 HTTPS;
  4. 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,静态资源加速收益明显

总结

  1. Let's Encrypt 是证书颁发方,只负责签发TLS证书;证书是HTTPS的基础;
  2. HTTPS = TLS加密 + HTTP,用来保障传输安全;
  3. HTTP/2 是应用层协议优化,依赖HTTPS(浏览器限制),但是证书不会自动开启HTTP/2,需要反向代理单独配置开关
  4. 在K8s体系:Traefik自带ACME,不用cert-manager;Ingress-Nginx必须搭配cert-manager管理LE证书;两种Ingress都支持一键开启HTTP/2。
相关推荐
snow@li2 小时前
服务器运维:堡垒机与服务器全景关系深度分析(架构、差异、协作、场景)
运维
爱和冰阔落2 小时前
【Linux】手写日志与固定线程池:任务队列、工作线程和安全退出
linux·运维·c++·redis·安卓
Gl�ria2 小时前
Hadoop MapReduce / Hive 场景:ReduceTask 热点 Key 排查
运维·hadoop·数据倾斜
snow@li3 小时前
服务器运维:K3S 下 Jenkins ↔ GitLab 的 CI/CD 闭环 / 访问成功
运维·gitlab·jenkins
志栋智能3 小时前
超自动化运维与DevOps的深度融合
运维·网络·人工智能·安全·自动化
前端世界11 小时前
Linux服务器实战:NTP时间同步、SELinux权限与rsyslog日志管理,一次搞懂三大运维问题
linux·运维·服务器
Android系统攻城狮11 小时前
Linux Gstreamer深度解析之gst_audio_converter_new调用流程与实战(二十)
linux·运维·服务器·gstreamer音视频·音视频进阶
海宇服务11 小时前
零信任架构实战:基于海宇对外投资历史查询服务构建自动化供应商准入网关
运维·人工智能·架构·自动化
上海云盾-小余11 小时前
BGP 高防底层原理:TCP 异常流量识别与清洗机制
运维·网络·tcp/ip