从 Terraform google_service_account_key 资源获取可用的 P12 bundle/private 密钥

Get usable P12 bundle/private key from Terraform google_service_account_key resource

我已经使用 Terraform google 提供程序为 GCP 服务帐户创建了一个服务帐户密钥。我已将私钥类型设置为 "TYPE_PKCS12_FILE",我们需要它与现有应用程序兼容。

当我将其作为 PoC 进行测试时,我通过控制台创建了 P12 密钥,并且没有任何问题。现在,我想在我们的 Terraform 脚本中处理密钥生成,但我无法获得有效的 P12 密钥。实际的密钥资源被创建,它包含一个 public_key 字段,它可以被 base64 解码为有效的 RSA 证书,以及一个 private_key,它应该是一个经过 base64 编码的 P12 文件,如果我正在正确阅读文档。

我试过将 Terraform 中的 private_key 值保存到一个文件中,然后手动对其进行 base64 解码。它表面上类似于已知的有效 P12 包,但当我尝试将其导入任何地方时,它被报告为无效证书。

状态中的对象看起来像:

"private_key": "MIIJ[...]GoA==",
"private_key_type": "TYPE_PKCS12_FILE",
"public_key": "LS0t[...]LQo=",
"public_key_data": null,
"public_key_type": "TYPE_X509_PEM_FILE",

那么,如何将 Terraform 资源中的 private_key 转换为可以上传到我们的应用程序的可用 P12 文件?

我自己回答这个问题,因为从 Terraform 收到的特定错误需要一些解释。如果您尝试在私钥上使用 TF 的 built-in base64decode() 函数,它会给出错误 "the result of decoding the provided string is not valid UTF-8".

我最初认为这是证书错误,因为我以为我希望私钥是 PEM 证书,但 private_key 值实际上包含完整的 P12 包。

将该字符串解码为 base64 的基本操作是正确的,但事实证明,Terraform 仅支持有限范围的编码。 Terraform 不支持解码为 P12 包,因为 TF 解析 base64decode() 调用的输出以确认它是有效的,并且它无法验证 P12 的编码,因为该编码不受支持。

解决方法是将private_key属性的输出字符串保存到txt文件中,然后使用opensslcertutil等证书管理工具进行处理解码。

示例:

certutil -decode please-decode-me.txt my-mydecoded-cert.p12

编辑:另外,请注意至少,VS Code 的 encode/decode 扩展不能正确处理 P12 文件的操作。我尝试了这种方法,认为这些操作会使文件的基础数据保持不变,并简单地用不同的编码再次解析它。这是不正确的,它会更改文件数据以匹配使用“找不到符号”字形的任何地方。

我认为这对安全专家来说是众所周知的and/or,但我想我会明确提及它以防它对不与证书自动化交互的任何其他 SRE 或应用程序开发人员有用定期。