1. 为什么需要更新Traefik的SSL证书
SSL证书就像网站的身份证,告诉访问者"我是安全的"。当浏览器提示"您的连接不是私密连接"时,就像门卫拦住了过期的访客证。我在管理一个电商平台时,证书突然过期导致支付页面无法访问,损失了当天30%的订单。
证书通常1年有效期,Let's Encrypt的免费证书更是只有90天。Traefik作为现代反向代理,管理着整个集群的流量,证书更新不及时会导致:
- 浏览器安全警告吓跑用户
- API接口调用失败
- 支付等敏感功能完全瘫痪
在Docker集群中,证书更新更复杂。我有次在单机环境测试成功的方案,到了生产集群却导致15分钟服务中断。后来发现是节点更新顺序有问题,这就是为什么需要专门讨论集群环境下的无缝更新。
2. 准备工作:获取新证书
更新前需要准备好新证书。我常用三种方式,各有利弊:
2.1 从CA机构获取证书
商业证书(如DigiCert)流程:
- 生成CSR:
openssl req -new -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr - 提交CA验证域名所有权
- 下载证书包(通常包含.crt和.ca-bundle)
2.2 使用Let's Encrypt自动获取
Traefik内置ACME支持,配置示例:
[certificatesResolvers.letsencrypt.acme]
email = "admin@example.com"
storage = "/acme.json"
[certificatesResolvers.letsencrypt.acme.httpChallenge]
entryPoint = "http"
2.3 企业内网自签名证书
开发环境可用mkcert工具:
mkcert -cert-file cert.pem -key-file key.pem "*.test.example.com"
无论哪种方式,最终需要:
- 私钥文件(.key)
- 证书文件(.crt或.pem)
- 中间证书(如有)
3. 单节点证书更新步骤
先看基础的单节点更新,这是集群更新的基础。最近帮一个客户更新时,发现他的traefik.toml配置有问题,导致证书加载失败。
3.1 备份原有证书
cp /etc/traefik/certs/example.crt{,.bak}
cp /etc/traefik/certs/example.key{,.bak}
3.2 更新证书文件
# 假设新证书已上传到/tmp
mv /tmp/new.crt /etc/traefik/certs/example.crt
mv /tmp/new.key /etc/traefik/certs/example.key
3.3 修改Traefik配置
静态配置示例(traefik.toml):
[[tls.certificates]]
certFile = "/etc/traefik/certs/example.crt"
keyFile = "/etc/traefik/certs/example.key"
动态配置示例(Docker标签):
labels:
- "traefik.http.routers.myapp.tls.certresolver=myresolver"
3.4 热重载配置
# 发送HUP信号
kill -HUP $(pidof traefik)
# 或通过API
curl -X POST http://localhost:8080/api/rawdata
3.5 验证更新
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -dates
4. Docker集群的滚动更新策略
生产环境多是多节点集群,我设计过银行系统的更新方案,关键是要做到零停机。
4.1 节点更新顺序
推荐流程:
- 边缘节点(非核心业务)
- 工作节点
- 管理节点
- 入口节点(最后更新)
4.2 使用Docker Swarm的更新
deploy:
update_config:
parallelism: 1
delay: 30s
order: start-first
4.3 Kubernetes的滚动更新
kubectl rollout restart deployment/traefik -n ingress
4.4 健康检查配置
必须配置:
healthcheck:
test: ["CMD", "traefik", "healthcheck"]
interval: 10s
timeout: 2s
retries: 3
5. 高级技巧与故障排查
5.1 通配符证书配置
对于*.example.com:
[[tls.certificates]]
certFile = "/certs/wildcard.crt"
keyFile = "/certs/wildcard.key"
[[tls.certificates.domains]]
main = "example.com"
sans = ["*.example.com"]
5.2 证书监控方案
Prometheus监控示例:
- job_name: 'ssl_expiry'
metrics_path: /probe
params:
module: [http_ssl_expiry]
target: [example.com:443]
static_configs:
- targets:
- example.com:443
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115
5.3 常见问题解决
证书不生效检查:
- 文件权限:
chmod 600 /path/to/cert - 路径映射:
docker inspect traefik | grep "Binds" - 时间同步:
ntpdate pool.ntp.org - 证书链完整:
openssl verify -CAfile ca-bundle.crt your-cert.crt
5.4 性能优化建议
对于高流量场景:
- 启用OCSP Stapling
- 调整TLS会话缓存
[tls.options]
[tls.options.default]
minVersion = "VersionTLS12"
cipherSuites = [
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
]
[[tls.options.default.clientAuth]]
caFiles = ["/certs/ca.crt"]
policy = "RequireAndVerifyClientCert"
6. 自动化更新方案
完全自动化是最佳实践,我实现过一个金融系统每天自动轮转证书。
6.1 使用Certbot钩子脚本
#!/bin/bash
# /etc/letsencrypt/renewal-hooks/deploy/traefik.sh
CONTAINER_NAME=traefik
CERT_DIR=/etc/traefik/certs
cp /etc/letsencrypt/live/example.com/fullchain.pem $CERT_DIR/
cp /etc/letsencrypt/live/example.com/privkey.pem $CERT_DIR/
docker kill -s HUP $CONTAINER_NAME
6.2 Kubernetes证书自动轮转
使用cert-manager:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-com
spec:
secretName: example-com-tls
issuerRef:
name: letsencrypt-prod
dnsNames:
- example.com
- '*.example.com'
6.3 自定义监控看板
Grafana面板需要监控:
- 证书过期时间
- 更新成功率
- 每个节点的证书版本
7. 安全最佳实践
7.1 证书存储安全
- 使用RAM磁盘存储私钥
- 限制容器访问:
--read-only - 密钥管理服务(如HashiCorp Vault)
7.2 最小权限原则
# 创建专用用户
adduser --system --no-create-home --group traefik-ssl
chown traefik-ssl:traefik-ssl /etc/traefik/certs
7.3 应急回滚方案
准备好回滚脚本:
#!/bin/bash
# rollback-ssl.sh
BACKUP_DIR=/backup/ssl/$(date +%Y%m%d)
docker stop traefik
cp $BACKUP_DIR/* /etc/traefik/certs/
docker start traefik
在实际操作中,我习惯先在测试集群演练整个流程。有次更新前发现新证书的SAN不包含关键子域名,避免了生产事故。证书管理看似简单,但在大规模分布式系统中,每个细节都可能导致意外中断。

3673

被折叠的 条评论
为什么被折叠?



