用户在使用Terraform 管理云上, SSL证书资源是基础设施即代码(IaC)实践的重要组成部分。通过声明式配置,你可以像管理计算、网络资源一样,统一管理证书的申请、部署、续期和销毁,确保安全策略的合规性和可重复性。下面我从概念、优势、典型流程、示例和最佳实践几个方面进行介绍。
一、为什么使用 Terraform 管理 SSL 证书?
声明式管理:将证书的配置(域名、验证方式、私钥算法等)以代码形式定义,便于版本控制、评审和回滚。
生命周期统一:证书的创建、验证、部署、续期和删除都可以通过 Terraform 工作流完成,避免手动操作。
依赖管理:Terraform 可自动处理证书与其他资源(如负载均衡器、CDN)的依赖关系,确保证书生效后再关联服务。
状态一致性:Terraform 状态文件记录了证书的当前状态,方便团队协作和资源审计。
二、主流云服务商的 SSL 证书资源
不同云厂商提供了用于管理 SSL 证书的 Terraform 资源,常见的有:
云厂商 资源类型 主要用途
AWS `aws_acm_certificate`<br>`aws_acm_certificate_validation` 申请、验证和续期公共/私有 ACM 证书
阿里云`alicloud_ssl_certificates_service_certificate`<br>`alicloud_ssl_certificates_service_certificate_extension` 上传自定义证书或购买托管证书
腾讯云 `tencentcloud_ssl_certificate`<br>`tencentcloud_ssl_pay_certificate` 托管证书和付费证书的管理
Google Cloud `google_certificate_manager_certificate`<br>`google_certificate_manager_dns_authorization` Certificate Manager 服务下的证书资源
Azure `azurerm_key_vault_certificate`<br>`azurerm_cdn_frontdoor_custom_domain` | Key Vault 中存储的证书,并关联 Front Door 等服务
本文以 AWS ACM和 阿里云 SSL 为例说明生命周期管理过程。
三、Terraform 管理 SSL 证书的生命周期阶段
1. 创建证书
对于公共证书,通常需要指定域名、验证方式(DNS 或 Email)。
对于私有证书,可能需要配合私有 CA 使用。
AWS ACM 示例:
hcl
# 申请证书
resource "aws_acm_certificate" "example" {
domain_name = "example.com"
validation_method = "DNS"
subject_alternative_names = ["*.example.com"]
lifecycle {
create_before_destroy = true
}
}
阿里云 SSL 证书(上传自有证书)示例:
hcl
resource "alicloud_ssl_certificates_service_certificate" "upload" {
name = "my-cert"
cert = file("${path.module}/cert.pem")
key = file("${path.module}/private.key")
}
2. 验证所有权
DNS 验证是最常用的自动验证方式,可以通过 Terraform 配合 DNS 记录实现全自动验证。
AWS ACM + Route53 自动验证:
hcl
resource "aws_route53_record" "validation" {
for_each = {
for dvo in aws_acm_certificate.example.domain_validation_options : dvo.domain_name => {
name = dvo.resource_record_name
record = dvo.resource_record_value
type = dvo.resource_record_type
}
}
zone_id = data.aws_route53_zone.example.zone_id
name = each.value.name
type = each.value.type
records = [each.value.record]
ttl = 60
}
resource "aws_acm_certificate_validation" "example" {
certificate_arn = aws_acm_certificate.example.arn
validation_record_fqdns = [for record in aws_route53_record.validation : record.fqdn]
}
阿里云 SSL 证书(自动验证):需要先创建 DNS 记录,然后提交验证。
3. 部署与关联
证书验证通过后,可以关联到负载均衡、CDN 或 API 网关等服务。
AWS ACM 证书关联到 ALB:
hcl
resource "aws_lb_listener" "https" {
load_balancer_arn = aws_lb.main.arn
port = "443"
protocol = "HTTPS"
ssl_policy = "ELBSecurityPolicy-2016-08"
certificate_arn = aws_acm_certificate.example.arn
}
4. 续期
公有证书:AWS ACM 会自动续期(只要 DNS 记录仍在),无需额外操作。阿里云托管证书通常需要手动续费或设置自动续费。
上传的自定义证书:需要手动更新证书文件,然后执行 `terraform apply` 来替换证书资源。
- 对于需要定期更新的私有证书,可以通过 Terraform 的 `lifecycle` 或外部数据源触发重新创建。
5. 导入与销毁
导入已有证书:使用 `terraform import` 命令将云上已有的证书纳入 Terraform 管理。
销毁:执行 `terraform destroy` 前需确认没有其他服务依赖该证书,否则可能破坏生产环境。
四、生命周期管理的最佳实践
1. 使用模块封装证书资源
将证书的申请、验证、输出封装为可复用的 Terraform 模块,便于在不同环境中使用。
hcl
module "acm_certificate" {
source = "./modules/acm"
domain_name = "example.com"
subject_alternative_names = ["*.example.com"]
zone_id = data.aws_route53_zone.main.zone_id
}
2. 处理好证书续期的零停机
- 对于 ACM 公有证书,由于自动续期,只需确保 DNS 验证记录保持有效(例如通过 Terraform 管理的 Route53 记录不会在续期时被删除)。
- 对于自定义证书,可以通过 `create_before_destroy` 生命周期规则,先创建新证书再替换旧证书。
hcl
lifecycle {
create_before_destroy = true
}
3. 敏感信息保护
私钥和证书内容应视为敏感数据,不要明文存储。可使用以下方式:
- 使用 Terraform 的 `sensitive` 变量标记。
- 将证书文件存储在安全的 Vault 中(如 AWS Secrets Manager, HashiCorp Vault),通过数据源读取。
- 避免将 `.pem` 文件提交到 Git,使用 `.gitignore` 或远程状态加密。
4. 状态管理与协作
- 使用远程状态(如 S3、Terraform Cloud)存储状态,并开启状态锁定。
- 为不同环境(dev/staging/prod)使用不同的状态文件。
5. 自动化验证
通过 CI/CD 流水线自动执行 `terraform plan` 和 `apply`,确保证书的创建和更新过程经过审核和测试。
6. 私有证书管理
对于企业内部的私有证书,可以使用云厂商的私有 CA 服务(如 AWS Private CA, 阿里云私有 CA),再通过 Terraform 签发和管理证书生命周期。
AWS Private CA 签发证书示例:
hcl
resource "aws_acmpca_certificate_authority" "example" {
type = "ROOT"
certificate_authority_configuration {
key_algorithm = "RSA_2048"
signing_algorithm = "SHA256WITHRSA"
subject {
common_name = "example.com"
}
}
}
resource "aws_acmpca_certificate" "issued" {
certificate_authority_arn = aws_acmpca_certificate_authority.example.arn
certificate_signing_request = file("csr.pem")
signing_algorithm = "SHA256WITHRSA"
validity {
type = "DAYS"
value = 365
}
}
五、常见问题与注意事项
1. 证书验证延迟
DNS 验证记录生效后,云服务可能需要几分钟到几小时才能完成验证。Terraform 应配置等待机制(如 `aws_acm_certificate_validation` 会等待验证完成)。
2. 续期时的依赖
如果证书被多个服务引用,替换证书时需确保所有关联资源也同步更新。可通过 Terraform 的依赖关系自动触发更新。
3. 跨账号/跨区域使用
例如在 AWS 中,ACM 证书是区域性的,跨区域使用时需要导出或使用 Global Accelerator 等特殊配置。Terraform 可以配合数据源从其他区域获取证书 ARN。
4. 证书吊销
目前大多数云厂商的 Terraform 资源不支持自动吊销证书,如需吊销需要调用 API 或控制台操作。
六、总结
使用 Terraform 管理 SSL证书的生命周期,能够将证书作为基础设施的一部分进行代码化管理,实现自动化申请、验证、部署和续期。通过结合 DNS 提供商、负载均衡等资源,可以构建完整的、零停机的 HTTPS 接入层。同时,注意敏感信息保护和状态管理,确保证书资产的安全与合规。
如果你的实际场景涉及特定的云厂商或复杂的证书类型,可以针对性地调整配置,但核心理念是一致的:将证书生命周期纳入 IaC 体系,让安全基础设施像其他资源一样可靠、可重复、可审计。