SuperAPI AI 工具集

ssl-tls-management

安全与审计

查看项目

更新于 10-15 06:42

技能介绍

用途 本技能用于在 Web 服务器、Kubernetes 集群和内部服务之间管理证书并保障通信安全。适用场景包括:为新 Web 应用配置 HTTPS;使用 Let's Encrypt 自动化证书续期;在 Kubernetes 中部署 cert-manager;为内部服务间通信配置 TLS;审计密码套件与 TLS 版本以满足合规要求;响应即将过期或已被泄露的证书。

前提条件 需要具备以下条件:拥有可控制 DNS 的域名(用于公共证书);Web 服务器上的 root/sudo 权限;已安装用于 Let's Encrypt 的 certbot;可用的 openssl CLI(多数 Linux 发行版默认安装);用于部署 cert-manager 的、带 Helm 的 Kubernetes 集群;以及对 X.509 证书信任链的理解。

Let's Encrypt 与 Certbot 安装与签发:在 Ubuntu/Debian 上可执行 apt 安装 certbot 及 python3-certbot-nginx。可通过 certbot --nginx -d example.com -d www.example.com 交互式获取证书;也可使用非交互模式(certbot certonly --nginx 带 --non-interactive、--agree-tos、--email 参数)实现自动化。无 Web 服务器运行时可用 standalone 模式(--standalone --preferred-challenges http);通配符证书可用 DNS 挑战(--manual --preferred-challenges dns -d "*.example.com")。也可使用 DNS 插件自动化,例如 Cloudflare:安装 certbot-dns-cloudflare,创建包含 dns_cloudflare_api_token 的凭据文件并设置权限 600,然后运行 certbot certonly --dns-cloudflare 并指定凭据文件与域名。 续期自动化:可先运行 certbot renew --dry-run 测试续期。推荐使用 systemd 计时器而非 cron:创建 certbot-renewal.service(Type=oneshot,执行 certbot renew --quiet --deploy-hook "systemctl reload nginx")和 certbot-renewal.timer(每天 00:00 与 12:00 运行,带随机延迟与持久化),启用并验证计时器。还可在 /etc/letsencrypt/renewal-hooks/deploy/ 放置续期后钩子脚本,重载 nginx 等使用该证书的服务。

面向 Kubernetes 的 cert-manager 安装:通过 Helm 添加 jetstack 仓库并更新,执行 helm install cert-manager,指定命名空间、创建命名空间、版本 v1.14.0、installCRDs=true 与 prometheus.enabled=true,然后用 kubectl 验证 Pod 与 CRD。 ClusterIssuer 配置:可定义 letsencrypt-staging(用于先测试)、letsencrypt-prod(生产)、letsencrypt-prod-dns(Cloudflare DNS 挑战,用于通配符证书)以及 selfsigned-ca(内部服务自签名 CA)。 Certificate 资源:可定义面向公众的证书(指定 secretName、issuerRef、dnsNames、duration 与 renewBefore)、通配符证书,以及带自动 TLS 的 Ingress(通过注解 cert-manager.io/cluster-issuer 指定签发者,并在 tls 段指定 hosts 与 secretName)。

OpenSSL 命令参考 可使用 OpenSSL 生成私钥(openssl genrsa,4096 位)、生成 ECDSA 密钥(ecparam -genkey -name prime256v1)、生成 CSR(openssl req -new)、生成带 SAN 的 CSR、生成自签名证书(用于开发/测试)、查看证书详情与有效期、检查远程证书、验证证书链、查看远程服务器证书链、在 PEM 与 PKCS12 之间转换,以及测试 TLS 连接与密码套件协商(如 -tls1_3 或指定 cipher)。

强 TLS 配置 Nginx:示例配置监听 443 ssl http2,指定证书与私钥路径,协议设为 TLSv1.2 与 TLSv1.3,配置密码套件、ssl_prefer_server_ciphers off、会话超时与缓存、关闭会话票据,启用 OCSP stapling 及验证并配置 resolver,添加 HSTS、X-Content-Type-Options、X-Frame-Options 等安全响应头,并在单独的 server 块中将 HTTP 重定向到 HTTPS。 Apache:示例 VirtualHost 开启 SSLEngine,指定证书与私钥文件,SSLProtocol 设 all 减去 SSLv3、TLSv1、TLSv1.1,配置 SSLCipherSuite、SSLHonorCipherOrder off,启用 SSLUseStapling 并配置缓存,设置 HSTS 头。

证书监控 提供 cert-monitor.sh 脚本示例,通过 openssl s_client 检查多个主机证书到期时间,按 30 天警告、7 天严重阈值输出状态。另提供 Prometheus 告警规则示例:当 certmanager_certificate_expiration_timestamp_seconds 与当前时间之差小于 7 天时触发 CertificateExpiringSoon;当 certmanager_certificate_ready_status 不为就绪时触发 CertificateNotReady。

故障排查 常见问题与处理:Certbot 报 connection refused 通常是 80 端口被防火墙拦截,需开放 80 端口用于 ACME HTTP-01 挑战;提示已签发过多证书是触发 Let's Encrypt 速率限制,应使用 staging 端点测试并等待限制重置;cert-manager 挑战长期 pending 多为 Ingress 或 DNS 配置错误,可用 kubectl describe challenge 检查并核对 DNS 记录;混合内容警告源于 HTTPS 页面加载 HTTP 资源,应更新资源 URL 为 HTTPS 并使用 CSP 头;OCSP stapling 不工作通常是未配置 resolver,需在 nginx 添加 resolver 指令;缺少中间证书时应使用 fullchain.pem 而非 cert.pem,并用 openssl s_client -showcerts 验证;TLS 握手失败通常是客户端不支持所提供密码套件,应增加 TLS 1.2 支持并检查套件兼容性。

最佳实践 使用 systemd 计时器或 cert-manager 自动化续期;通过告警监控到期日期(30 天与 7 天警告);仅使用 TLS 1.2 与 TLS 1.3;启用带长 max-age 与 includeSubDomains 的 HSTS;启用 OCSP stapling 以改善握手性能;尽可能使用 ECDSA 密钥;用 SSL Labs 测试配置;以适当文件权限(0600)保护私钥;在到期前而非到期后轮换证书;维护所有服务的证书清单。

相关技能 hashicorp-vault(PKI 管理)、waf-setup(Web 防护)、zero-trust(mTLS 与基于身份访问)。