TLS实施技能Skill implementing-tls

本技能专注于配置TLS证书和加密,用于安全网络通信,包括HTTPS设置、服务间安全连接、相互TLS(mTLS)实现、证书生命周期管理和问题调试。适用于Web应用、微服务架构和零信任网络。关键词:TLS, HTTPS, 证书管理, 加密, 网络安全, mTLS, 零信任架构, 云原生。

密码学 0 次安装 0 次浏览 更新于 3/23/2026

名称:实施TLS 描述:配置TLS证书和加密以进行安全通信。用于设置HTTPS、保护服务间连接、实现相互TLS(mTLS)或调试证书问题。

实施TLS

目的

实施传输层安全(TLS)以加密网络通信和验证服务。生成证书,使用Let’s Encrypt或内部CA自动化证书生命周期管理,配置TLS 1.3,实现相互TLS以进行服务认证,并调试常见证书问题。

何时使用此技能

在以下情况触发此技能:

  • 为Web应用程序或API设置HTTPS
  • 在微服务中保护服务间通信
  • 为零信任网络实现相互TLS(mTLS)
  • 为开发或生产生成证书
  • 自动化证书续订和轮换
  • 调试证书验证错误
  • 在负载均衡器配置TLS终止
  • 为企业网络设置内部PKI

快速开始

用于开发(本地HTTPS)

使用mkcert获取可信的本地证书:

# 安装mkcert
brew install mkcert  # macOS
# sudo apt install mkcert  # Linux

# 安装本地CA
mkcert -install

# 生成证书
mkcert example.com localhost 127.0.0.1
# 创建:example.com+2.pem 和 example.com+2-key.pem

用于生产(公共HTTPS)

Kubernetes 使用 cert-manager:

# 安装 cert-manager
helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager --create-namespace \
  --set installCRDs=true

# 创建 Let's Encrypt 签发者
kubectl apply -f - <<EOF
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@example.com
    privateKeySecretRef:
      name: letsencrypt-prod-key
    solvers:
    - http01:
        ingress:
          class: nginx
EOF

传统服务器使用 Certbot:

# 安装 certbot
sudo apt install certbot

# 获取证书
sudo certbot certonly --standalone -d example.com -d www.example.com
# 证书保存到 /etc/letsencrypt/live/example.com/

用于内部服务(内部PKI)

使用 CFSSL 生成内部CA:

# 安装 CFSSL
brew install cfssl  # macOS

# 创建 CA
cfssl genkey -initca ca-csr.json | cfssljson -bare ca

# 生成服务器证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \
  -config=ca-config.json -profile=server \
  server-csr.json | cfssljson -bare server

参见 examples/cfssl-ca/ 获取完整配置文件。

TLS 1.3 配置最佳实践

协议版本

仅启用 TLS 1.3 和 1.2:

# Nginx
ssl_protocols TLSv1.3 TLSv1.2;
ssl_prefer_server_ciphers off;  # 让客户端选择

禁用过时协议:SSLv3, TLS 1.0, TLS 1.1。

密码套件

TLS 1.3(5个密码套件):

TLS_AES_256_GCM_SHA384           # 推荐
TLS_CHACHA20_POLY1305_SHA256     # 移动优化
TLS_AES_128_GCM_SHA256           # 性能

TLS 1.2 回退:

ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305';

安全功能

  • 完美前向保密(PFS):使用临时密钥交换(ECDHE)
  • OCSP装订:启用以提高性能和隐私
  • HSTS:使用 Strict-Transport-Security 头部强制HTTPS
  • 禁用压缩:防止CRIME攻击

有关详细TLS 1.3配置,参见 references/tls13-best-practices.md

决策框架

证书类型选择

需要TLS证书?
│
├─ 面向公众(互联网用户)?
│  │
│  ├─ 单域名 → Let's Encrypt 使用 HTTP-01
│  │  工具:certbot, cert-manager
│  │  挑战:HTTP验证
│  │
│  └─ 多子域名 → Let's Encrypt 使用 DNS-01
│     工具:certbot 带DNS插件, cert-manager
│     挑战:DNS TXT记录
│     支持:通配符证书(*.example.com)
│
└─ 内部(企业网络)?
   │
   ├─ 开发 → mkcert 或自签名
   │  工具:mkcert(可信), openssl(基础)
   │  无需自动化
   │
   └─ 生产 → 内部CA
      │
      ├─ 小规模(<10服务) → CFSSL
      │  手动管理可接受
      │
      └─ 大规模(100+服务) → Vault PKI 或 cert-manager
         动态秘密,自动轮换

自动化工具选择

环境?
│
├─ Kubernetes → cert-manager
│  原生CRDs,Ingress集成
│  支持:Let's Encrypt, Vault, CA, 自签名
│
├─ 传统服务器(VMs) → Certbot(公共)或 CFSSL(内部)
│  插件:nginx, apache, DNS提供商
│  通过cron/systemd自动化续订
│
├─ 微服务(任何平台) → HashiCorp Vault PKI
│  动态秘密,短期证书
│  API驱动,服务网格集成
│
└─ 开发者工作站 → mkcert
   浏览器自动信任

标准TLS vs 相互TLS(mTLS)

使用标准TLS(仅服务器认证)当:

  • 公共网站(用户信任服务器)
  • 带有承载令牌的API(单独认证层)
  • 服务位于API网关后
  • 简单架构(<5服务)

使用相互TLS(双方认证)当:

  • 微服务中的服务间通信
  • 高安全要求(金融、医疗)
  • 机器对机器API
  • 零信任网络
  • 无共享网络信任

参见 references/mtls-guide.md 获取mTLS实施模式。

常见工作流

生成自签名证书

带SAN的快速生成:

# 创建OpenSSL配置
cat > san.cnf <<EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = v3_req

[dn]
CN = example.com

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = api.example.com
IP.1 = 192.168.1.100
EOF

# 生成密钥和证书
openssl req -x509 -newkey rsa:2048 -nodes \
  -keyout server-key.pem -out server-cert.pem \
  -days 365 -config san.cnf -extensions v3_req

# 验证SANs
openssl x509 -in server-cert.pem -noout -text | grep -A 3 "Subject Alternative Name"

有关详细示例包括CFSSL和mkcert,参见 references/certificate-generation.mdexamples/self-signed/

设置Let’s Encrypt自动化

使用Certbot(传统服务器):

# 独立模式(端口80必须空闲)
sudo certbot certonly --standalone -d example.com -d www.example.com

# Webroot模式(无服务中断)
sudo certbot certonly --webroot -w /var/www/html -d example.com

# DNS挑战(支持通配符)
sudo certbot certonly --manual --preferred-challenges dns \
  -d example.com -d "*.example.com"

# 测试续订
sudo certbot renew --dry-run

使用cert-manager(Kubernetes):

# Ingress带自动证书
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  tls:
  - hosts:
    - example.com
    secretName: example-com-tls
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80

参见 references/automation-patterns.md 获取完整自动化指南。

配置相互TLS(mTLS)

服务器配置(Nginx):

server {
    listen 443 ssl;
    server_name api.example.com;

    # 服务器证书
    ssl_certificate /etc/ssl/certs/server.crt;
    ssl_certificate_key /etc/ssl/private/server.key;

    # CA以验证客户端证书
    ssl_client_certificate /etc/ssl/certs/ca.crt;
    ssl_verify_client on;
    ssl_verify_depth 2;

    # TLS 1.3
    ssl_protocols TLSv1.3;

    location / {
        proxy_pass http://backend;
        # 传递客户端证书信息到后端
        proxy_set_header X-SSL-Client-Cert $ssl_client_cert;
        proxy_set_header X-SSL-Client-S-DN $ssl_client_s_dn;
    }
}

客户端请求带证书:

curl https://api.example.com/endpoint \
  --cert client.crt \
  --key client.key \
  --cacert ca.crt

参见 references/mtls-guide.mdexamples/mtls-nginx/ 获取完整mTLS实施。

调试TLS问题

测试TLS连接:

# 基础连接测试
openssl s_client -connect example.com:443

# 显示证书链
openssl s_client -connect example.com:443 -showcerts

# 测试特定TLS版本
openssl s_client -connect example.com:443 -tls1_3

# 测试带客户端证书(mTLS)
openssl s_client -connect api.example.com:443 \
  -cert client.crt -key client.key -CAfile ca.crt

检查证书:

# 查看证书详情
openssl x509 -in cert.pem -noout -text

# 检查过期时间
openssl x509 -in cert.pem -noout -dates

# 检查主题替代名称
openssl x509 -in cert.pem -noout -text | grep -A 1 "Subject Alternative Name"

# 验证证书链
openssl verify -CAfile ca.crt cert.pem

验证密钥和证书匹配:

# 证书模数
openssl x509 -in cert.pem -noout -modulus | md5sum

# 密钥模数(必须匹配)
openssl rsa -in key.pem -noout -modulus | md5sum

常见错误和解决方案:

错误 原因 解决方案
certificate has expired 证书有效期已过 续订证书,检查系统时钟
unable to get local issuer certificate CA不在信任存储中 添加CA证书到系统信任存储
Hostname mismatch CN/SAN不匹配主机名 使用正确SANs重新生成证书
handshake failure TLS版本/密码套件不匹配 启用TLS 1.2+,检查密码套件
certificate signed by unknown authority 缺少中间证书 在服务器配置中包含完整链

参见 references/debugging-tls.md 获取全面故障排除指南。

工具选择指南

使用案例 环境 推荐工具 替代方案
公共HTTPS Kubernetes cert-manager External Secrets Operator
公共HTTPS VMs/裸金属 Certbot acme.sh
内部PKI 任何 HashiCorp Vault CFSSL, Smallstep
mTLS(K8s) Kubernetes cert-manager + Istio Linkerd, Consul
mTLS(VMs) 传统 Vault PKI CFSSL
本地开发 工作站 mkcert 自签名(OpenSSL)
调试 任何 OpenSSL s_client curl -v
自动化 CI/CD CFSSL API Vault API

证书生命周期

1. 生成
   ├─ 开发:mkcert, 自签名(OpenSSL)
   ├─ 生产:Let's Encrypt, 商业CA
   └─ 内部:CFSSL, Vault PKI

2. 部署
   ├─ Kubernetes:作为Secret卷挂载
   ├─ VMs:复制到 /etc/ssl/ 或应用程序目录
   └─ 容器:通过Docker卷挂载

3. 监控
   ├─ 检查过期:openssl x509 -noout -dates
   ├─ Prometheus:blackbox_exporter(probe_ssl_earliest_cert_expiry)
   └─ 警报:过期前 < 7 天

4. 续订
   ├─ 自动化:certbot renew, cert-manager, Vault Agent
   ├─ 手动:生成新CSR,从CA重新签发
   └─ 时机:过期前30天续订

5. 轮换
   ├─ 零停机:加载新证书,优雅重载
   ├─ Kubernetes:更新Secret,滚动重启
   └─ 服务网格:自动轮换(Istio, Linkerd)

证书格式

PEM(最常见):

  • 扩展名:.pem, .crt, .cer, .key
  • Base64编码,ASCII文本
  • 使用于:Apache, Nginx, OpenSSL

DER(二进制):

  • 扩展名:.der, .cer
  • 二进制格式
  • 使用于:Java, Windows

PKCS#12 / PFX(容器):

  • 扩展名:.p12, .pfx
  • 包含证书 + 私钥(密码保护)
  • 使用于:Windows, Java keystores, 浏览器

转换格式:

# PEM 到 DER
openssl x509 -in cert.pem -outform DER -out cert.der

# PEM 到 PKCS#12
openssl pkcs12 -export -out cert.p12 -inkey key.pem -in cert.pem

# PKCS#12 到 PEM
openssl pkcs12 -in cert.p12 -out cert.pem -nodes

参见 scripts/convert-formats.sh 获取自动化转换。

参考

详细指南

  • references/certificate-generation.md - 全面生成示例(OpenSSL, CFSSL, mkcert)
  • references/automation-patterns.md - 自动化深入(Certbot, cert-manager, Vault PKI)
  • references/mtls-guide.md - mTLS实施模式和架构
  • references/debugging-tls.md - 故障排除指南,含常见错误和解决方案
  • references/tls13-best-practices.md - TLS 1.3配置和安全功能

示例

工作代码

  • examples/self-signed/ - 自签名证书生成脚本
  • examples/cfssl-ca/ - 内部CA设置与CFSSL(完整配置)
  • examples/certbot/ - Let’s Encrypt自动化(独立、webroot、DNS挑战)
  • examples/cert-manager/ - Kubernetes证书管理(ClusterIssuer, Ingress)
  • examples/mtls-nginx/ - 相互TLS与Nginx(服务器 + 客户端配置)
  • examples/vault-pki/ - Vault PKI集成和动态证书

脚本

实用工具

  • scripts/check-cert-expiry.sh - 监控多个域的证书过期
  • scripts/validate-chain.sh - 验证证书链完整性
  • scripts/test-tls-connection.sh - 测试TLS连接,含各种选项
  • scripts/convert-formats.sh - 在PEM、DER和PKCS#12格式间转换

相关技能

安全和认证:

  • secret-management - 安全存储私钥(Vault, Kubernetes Secrets, HSM)
  • auth-security - 应用级认证(OAuth, OIDC, JWT)
  • security-hardening - 系统安全配置
  • security-architecture - 整体安全设计和威胁建模

基础设施:

  • kubernetes-operations - Kubernetes集群TLS配置
  • load-balancing-patterns - 负载均衡器TLS终止
  • network-architecture - 网络安全设计

运营:

  • deploying-applications - 运行时注入证书
  • observability - 监控证书健康和过期
  • building-ci-pipelines - 在CI/CD中自动化证书生成