【问题标题】:Terraform Incapsula provider fails to create custom certificate resourceTerraform Incapsula 提供程序无法创建自定义证书资源
【发布时间】:2020-09-27 20:55:23
【问题描述】:

我们正在尝试使用 Terraform Incapsula privider 来管理 Imperva 站点和自定义证书资源。

我们能够创建 Imperva 站点资源,但证书资源创建失败。

我们的用例是从 Azure KeyVault 获取证书并使用 Incapsula Privider 将其导入 Imperva。我们使用 Terraform“azurerm_key_vault_secret”数据源从 KeyVault 获取证书。它以 Base64 字符串的形式返回证书,我们将其作为“certificate”参数传递到 Terraform“incapsula_custom_certificate”资源以及使用 Terraform“incapsula_site”资源创建的 siteID。当我们运行“terraform apply”时,我们会收到以下错误。

incapsula_custom_certificate.custom-certificate: Creating...

Error: Error from Incapsula service when adding custom certificate for site_id ******807: {"res":2,"res_message":"Invalid input","debug_info":{"certificate":"invalid certificate or passphrase","id-info":"13007"}}

  on main.tf line 36, in resource "incapsula_custom_certificate" "custom-certificate":
  36: resource "incapsula_custom_certificate" "custom-certificate" { 

我们尝试使用 Terraform“filebase64”函数从 Base64 编码的 PFX 文件中读取证书,但我们得到了同样的错误。

这是我们的 Terraform 代码:​​

provider "azurerm" {
  version = "=2.12.0"
  features {}
}

data "azurerm_key_vault_secret" "imperva_api_id" {
    name = var.imperva-api-id
    key_vault_id = var.kv.id
}

data "azurerm_key_vault_secret" "imperva_api_key" {
    name = var.imperva-api-key
    key_vault_id = var.kv.id
}

data "azurerm_key_vault_secret" "cert" {
  name = var.certificate_name
  key_vault_id = var.kv.id
}

provider "incapsula" {
  api_id = data.azurerm_key_vault_secret.imperva_api_id.value
  api_key = data.azurerm_key_vault_secret.imperva_api_key.value
}

resource "incapsula_site" "site" {
  domain = var.client_facing_fqdn
  send_site_setup_emails = true
  site_ip                = var.tm_cname
  force_ssl              = true
}

resource "incapsula_custom_certificate" "custom-certificate" {
  site_id = incapsula_site.site.id
  certificate =  data.azurerm_key_vault_secret.cert.value
  #certificate =   filebase64("certificate.pfx")
}

通过从 Python 脚本直接调用 Imperva API,我们能够使用相同的站点 ID、Imperva API ID 和密钥导入相同的 PFX 证书文件。

证书没有passphase。

是我们做错了什么还是这是 Incapsula 提供程序的问题?

【问题讨论】:

    标签: azure certificate terraform incapsula imperva


    【解决方案1】:

    查看提供程序的源代码,它似乎已经在执行 base64 编码操作作为 AddCertificate 函数的一部分,这意味着使用 Terraform filebase64 函数对证书进行双重编码。

    相反,我认为它应该是这样的:

    resource "incapsula_custom_certificate" "custom-certificate" {
      site_id = incapsula_site.site.id
      certificate = file("certificate.pfx")
    }
    

    【讨论】:

    • 当尝试按照@pk__ 的建议读取 .pfx 文件时,出现以下错误:错误:main.tf 第 45 行的函数调用错误,资源“incapsula_custom_certificate”“custom-certificate”:45 : certificate = file("certificate.pfx") 调用函数“file”失败:certificate.pfx 的内容不是有效的 UTF-8;使用 filebase64 函数获取 Base64 编码的内容或其他文件函数(例如 filemd5、filesha256)来获取文件哈希结果。
    • 我还尝试使用“local_file”数据源“certificate = data.local_file.cer.content”读取 pfx 文件,但会导致此错误:错误:添加自定义证书时来自 Incapsula 服务的错​​误site_id *******07: {"res":2,"res_message":"Invalid input","debug_info":{"certificate":"invalid certificate or passphrase","id-info":"13008 "}}
    【解决方案2】:

    如果 azure 的返回值是 base64,那么类似的方法也可以工作。

    certificate = base64decode(data.azurerm_key_vault_secret.cert.value)
    

    【讨论】:

    • 当我尝试按照@Joe Moore 的建议解码从 Azure 返回的值时,我收到以下错误:错误:main.tf 第 48 行的函数调用错误,在资源“incapsula_custom_certificate”“custom-certificate”中": 48: 证书 = base64decode(data.azurerm_key_vault_secret.cert.value) |---------------- | data.azurerm_key_vault_secret.cert.value is "****************************" 调用函数 "base64decode" 失败:对提供的字符串进行解码的结果是UTF-8 无效。
    【解决方案3】:

    您是否尝试过创建自签名证书、使用密码将其转换为 PFX 并使用它?

    我之所以问是因为 Azure 的 PFX 输出有一个空白/不存在的密码短语,而且多年来我遇到了一些工具的问题,这些工具根本不会导入 PFX,除非您设置密码短语。

    【讨论】:

    • 我已经尝试过您的建议 - 创建自签名证书并将其导出为带有密码的 PFX 文件。当我通过传递密码(使用 Incapsula 提供程序)绑定上传它时,我得到了与我在上面的问题中描述的相同的错误。
    猜你喜欢
    • 2020-07-08
    • 2021-03-14
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多