作为秘密存储在 Azure Key Vault 中的 Cert 只能通过 ARM 模板检索一次其私钥。

问题描述 投票:0回答:1

这是一个奇怪的问题。

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

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

虚拟机被创建了 The VM got created, 当我在LocalMachineMy商店中查看时 and when I looked in the LocalMachineMy store, 我可以看到证书和它的私钥都很好看 I could see the cert sitting pretty with its private keys. 所以一切都很好。

每隔一段时间 我尝试使用这个相同的秘密创建一个虚拟机,它导入证书时没有私钥。 在部署过程中没有错误信息。 除了虚拟机本身的名称外,ARM模板是相同的。 证书在它应该在的地方,在LocalMachineMy中,只是缺少了它的私钥。

我可以手动下载证书和它的私钥就好了。 cert本身并没有被改变,只有秘密的版本,而且在所有的ARM模板中,Uri的配置是相同的。

我上面描述的行为是可以重现的。 创建新的自签名cert,上传到Azure Key Vault,第一个用ARM Template引用密钥创建的虚拟机有私钥,所有后续的虚拟机因此创建的虚拟机没有。

这让我很头疼。 有什么办法可以解决这个问题,为什么第一次就能成功,但以后就不行了?

azure azure-keyvault arm-template
1个回答
0
投票

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

我没有讲完整的故事。 我不仅在 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"
    }

然后私钥就安装好了 And then the private cert was installed just fine.

那为什么第一次的顺序不对,却能成功呢? 我只能猜测,因为私有证书比公有证书长很多,从密钥库中检索需要更多的时间,所以Azure将公有证书的顺序先放在私有证书之上。 此后这些证书会缓存在Azure后台的某个地方,未来的ARM部署会按照你指定的顺序安装。

以上纯属猜测。

这一切证明的是,我无法相信通过ARM模板安装certs的顺序。 所以我将不得不进行多步骤部署。 我将首先创建只有公共证书的虚拟机,然后再做另一个只有私有证书的部署。

我测试了这一点,它的工作。 公用证书通过虚拟机的ARM模板被安装,然后当部署第二个只包含私有证书的ARM模板时,私有证书被正确安装。

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

© www.soinside.com 2019 - 2024. All rights reserved.