You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Windows系统的Terraform provisioner配置CA证书验证

解决方法

你需要获取WinRM服务绑定的自签名证书的PEM格式公钥,cacert参数支持直接传入该公钥的字符串内容,或本地存储该公钥的文件路径,可按以下步骤实现:

步骤1:调整实例置备的PowerShell脚本

在你现有user_data的PowerShell脚本(生成自签名证书、配置WinRM、开放防火墙的逻辑)末尾,添加公钥导出逻辑:

# 替换为你生成自签名证书时使用的友好名/指纹,匹配你实际生成的证书
$winrmCert = Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.FriendlyName -eq "WinRM_HTTPS_Cert"} | Select-Object -First 1
# 导出公钥为Base64编码格式
$certBytes = $winrmCert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Cert)
$certBase64 = [System.Convert]::ToBase64String($certBytes, [System.Base64FormattingOptions]::InsertLineBreaks)
# 生成标准PEM格式公钥内容
$pemCert = "-----BEGIN CERTIFICATE-----`n$certBase64`n-----END CERTIFICATE-----"
# 输出到启动日志,方便后续读取
Write-Output "WINRM_CERT_START`n$pemCert`nWINRM_CERT_END"

步骤2:Terraform侧获取证书并配置连接

推荐两种无额外依赖的实现方式:

  • 方式1:临时拉取证书存为本地文件
    先通过本地命令拉取远程WinRM服务的公钥存为本地文件,后续正式连接直接引用该文件即可:
# 前置操作:拉取远程证书保存到本地
provisioner "local-exec" {
  command = <<EOT
openssl s_client -connect ${self.access_ip_v4}:5986 -showcerts < /dev/null 2>/dev/null | openssl x509 -outform PEM > ${path.module}/winrm_cacert.pem
EOT
}

# 正式部署用的provisioner,符合全程加密要求
provisioner "remote-exec" {
  connection {
    type     = winrm
    user     = "administrator"
    password = "你的管理员密码"
    timeout  = "3m"
    port     = 5986
    https    = true
    insecure = false
    cacert   = file("${path.module}/winrm_cacert.pem")
    host     = self.access_ip_v4
  }
  # 此处放置你实际的部署逻辑
}
  • 方式2:通过云厂商数据源读取证书内容
    如果你使用的云平台支持通过Terraform数据源获取实例启动日志,可直接从日志中匹配提取步骤1输出的PEM公钥内容,直接赋值给cacert参数即可,无需本地存储证书文件。

校验要求

你生成的自签名证书的使用者备用名称(SAN)或通用名(CN)需要和你connection配置中的host值匹配,如果你直接用IP连接,生成证书时需要把实例IP加入到SAN字段中,否则会触发证书域名不匹配的校验错误。

内容的提问来源于stack exchange,提问作者Rishabh Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:45:03