【问题标题】:Cert stored as secret in Azure Key Vault can only have its private keys retrieved once via ARM Template在 Azure Key Vault 中存储为机密的证书只能通过 ARM 模板检索其私钥一次
【发布时间】:2020-09-09 19:11:11
【问题描述】:

这是一个奇怪的问题。

我创建了一个自签名证书并从中创建了一个 PFX 文件。然后,我将 PFX 文件转换为 base64 编码的字符串,并将其作为机密存储在 Azure Key Vault 中。然后我使用带有以下代码的 ARM 模板创建了一个新的 Windows VM:

"osProfile": {
  "secrets": [
    {
      "sourceVault": {
        "id": "[parameters('vaultResourceId')]"
      },
      "vaultCertificates": [
        {
          "certificateUrl": "[parameters('headNodeCertPrivateUri')]",
          "certificateStore": "My"
        }
      ]
    }
  ]
}

VM 已创建,当我查看 LocalMachine/My store 时,我可以看到证书和它的私钥一起放置得很漂亮。所以一切都很好。

每隔一段时间我尝试使用相同的密钥创建一个 VM,它会在没有私钥的情况下导入证书。部署期间没有错误消息。除了 VM 本身的名称之外,ARM 模板是相同的。证书是它应该在的地方,在 LocalMachine/My 中,它只是缺少它的私钥。

我可以使用其私钥手动下载证书。证书本身没有改变;只有一个版本的密钥,并且所有 ARM 模板中的 Uri 配置相同。

我上面描述的行为是可重现的。创建新的自签名证书,将其上传到 Azure Key Vault,使用 ARM 模板引用密钥创建的第一个 VM 具有私钥,因此创建的所有后续 VM 都没有。

这让我很头疼。知道为什么这第一次会起作用,但以后不会起作用吗?

【问题讨论】:

    标签: azure azure-keyvault arm-template


    【解决方案1】:

    所以我想我找到了答案。它同样奇怪。

    我没有讲完整的故事。我不只是在 LocalMachine\My 中安装私有证书;我还在 LocalMachine\Root 中安装了公共证书。因为这是自签名证书,Windows 不会验证自签名证书,除非 LocalMachine\Root 中存在匹配的公共证书。

    我在 ARM 中的完整“秘密”部分是:

    "vaultCertificates": [
        {
            "certificateUrl": "[parameters('headNodeCertPrivateUri')]",
            "certificateStore": "My"
        },
        {
            "certificateUrl": "[parameters('headNodeCertPublicUri')]",
            "certificateStore": "Root"
        }
    

    我认为发生的事情是这样的:它安装了私有证书,Windows 不会接受私钥,因为它找不到受信任的根证书,然后它安装了公共证书。

    我只是把它翻过来:

    "vaultCertificates": [
        {
            "certificateUrl": "[parameters('headNodeCertPublicUri')]",
            "certificateStore": "Root"
        },
        {
            "certificateUrl": "[parameters('headNodeCertPrivateUri')]",
            "certificateStore": "My"
        }
    

    然后私有证书就安装好了。

    那么为什么它第一次按错误顺序工作?我只能猜测,因为私有证书比公共证书长得多,从密钥库中检索需要更多时间,所以 Azure 先将公共证书排序在私有证书之上。此后,证书将缓存在 Azure 后端某处,未来的 ARM 部署将按照您指定的顺序安装它们。

    以上纯属猜测。

    这一切都证明,我无法相信将通过 ARM 模板安装证书的顺序。所以我将不得不进行多步骤部署。我将首先仅使用公共证书创建 VM,然后仅使用私有证书进行另一次部署。

    我对此进行了测试,它工作正常:通过 VM 的 ARM 模板安装公共证书,然后在部署仅包含私有证书的第二个 ARM 模板时正确安装私有证书。

    功能请求:允许我们指定秘密的安装顺序。 :)

    【讨论】:

      猜你喜欢
      • 2018-12-29
      • 2023-01-26
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      相关资源
      最近更新 更多