三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

K8s证书管理避坑指南:cfssl工具链从CA创建到证书签发的完整流程

K8s证书管理避坑指南:cfssl工具链从CA创建到证书签发的完整流程

Kubernetes证书管理实战:cfssl工具链全流程解析与避坑指南

在云原生架构中,TLS证书管理是保障服务间通信安全的核心环节。当运维团队面对Kubernetes集群中数以百计的微服务证书时,如何构建可靠的证书生命周期管理体系?本文将深入解析基于cfssl工具链的证书管理方案,从CA机构创建到终端证书签发,提供一套可集成到CI/CD的完整工作流。

1. 证书管理体系设计基础

1.1 PKI架构选择

在构建私有PKI体系时,通常面临两种选择:

  • 单层CA架构:适合中小规模集群,所有服务证书由同一CA签发
  • 分层CA架构:根CA只签发中间CA,由中间CA签发终端证书,适合多团队协作场景
// 典型的分层CA结构示例 { "root": { "validity": "10y", "usage": ["cert sign", "crl sign"] }, "intermediate": { "validity": "5y", "usage": ["server auth", "client auth"] } }

1.2 证书关键参数

制作配置文件时需要特别关注以下参数:

参数项说明推荐值
key.algo密钥算法类型ecdsa或rsa
key.size密钥长度ecdsa: 256, rsa: 2048
expiry证书有效期生产环境建议1-2年
usages证书用途按实际场景组合

注意:过长的有效期会增加私钥泄露风险,而过短则增加运维负担

2. cfssl工具链深度配置

2.1 安装与验证

获取最新版cfssl工具集:

# 下载二进制文件 CFSSL_VERSION="1.6.3" wget https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssl_${CFSSL_VERSION}_linux_amd64 -O cfssl wget https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssljson_${CFSSL_VERSION}_linux_amd64 -O cfssljson # 设置执行权限 chmod +x cfssl cfssljson mv cfssl cfssljson /usr/local/bin/ # 验证安装 cfssl version

2.2 CA配置生成

创建根CA配置文件时需包含完整的主体信息:

// ca-root-config.json { "CN": "K8S Root CA", "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "MyOrg", "OU": "Security" } ], "ca": { "expiry": "87600h" } }

生成CA证书和私钥:

cfssl gencert -initca ca-root-config.json | cfssljson -bare ca-root

生成文件说明:

  • ca-root.pem:CA证书(公开)
  • ca-root-key.pem:CA私钥(绝密)
  • ca-root.csr:证书请求文件(可删除)

3. 服务证书签发实战

3.1 证书签名请求(CSR)配置

为nginx服务创建证书配置示例:

// nginx-server-config.json { "CN": "nginx.default.svc.cluster.local", "hosts": [ "nginx", "nginx.default", "nginx.default.svc", "nginx.default.svc.cluster.local", "192.168.1.10" ], "key": { "algo": "rsa", "size": 2048 } }

关键配置说明:

  • CN:证书的Common Name
  • hosts:必须包含服务所有可能的访问域名和IP
  • key:建议生产环境使用RSA 2048或ECDSA P256

3.2 证书签发流程

使用CA签发服务证书:

cfssl gencert \ -ca=ca-root.pem \ -ca-key=ca-root-key.pem \ -config=ca-config.json \ -profile=server \ nginx-server-config.json | cfssljson -bare nginx-server

签发后生成文件:

  • nginx-server.pem:服务证书
  • nginx-server-key.pem:服务私钥
  • nginx-server.csr:可删除的请求文件

4. Kubernetes证书集成方案

4.1 Secret资源创建

将证书存入Kubernetes Secret:

kubectl create secret tls nginx-tls \ --cert=nginx-server.pem \ --key=nginx-server-key.pem \ --dry-run=client -o yaml > nginx-tls-secret.yaml

典型Secret资源定义:

apiVersion: v1 kind: Secret metadata: name: nginx-tls namespace: default type: kubernetes.io/tls data: tls.crt: BASE64_ENCODED_CERT tls.key: BASE64_ENCODED_KEY

4.2 Ingress TLS配置

在Ingress中引用TLS Secret:

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress spec: tls: - hosts: - nginx.example.com secretName: nginx-tls rules: - host: nginx.example.com http: paths: - path: / pathType: Prefix backend: service: name: nginx port: number: 80

5. 证书生命周期管理

5.1 证书轮换策略

推荐采用双证书交替更新方案:

  1. 生成新版本证书(如v2)
  2. 更新Secret资源
  3. 滚动重启相关Pod
  4. 验证无误后下线旧证书
# 证书续期命令示例 cfssl gencert -ca ca-root.pem -ca-key ca-root-key.pem \ -config ca-config.json -profile server \ -cn "nginx-v2" nginx-server-config.json | cfssljson -bare nginx-server-v2

5.2 证书监控方案

通过Prometheus监控证书过期时间:

# prometheus-cert-exporter配置示例 - job_name: 'certificate_expiry' metrics_path: '/probe' params: module: [http_ssl_expiry] static_configs: - targets: - nginx.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

告警规则配置示例:

groups: - name: certificate.rules rules: - alert: CertificateExpirySoon expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30 for: 5m labels: severity: warning annotations: summary: "Certificate expiring soon (instance {{ $labels.instance }})" description: "SSL certificate will expire in 30 days"

在实施过程中发现,采用ECDSA算法相比RSA能显著降低CPU消耗,特别是在TLS握手频繁的场景下。但需要注意部分旧版客户端可能不兼容ECDSA证书,需要进行充分的兼容性测试。

← 返回列表