名称:实施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.md 和 examples/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.md 和 examples/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中自动化证书生成