如何为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
相关产品推荐
相关产品推荐

