是否可以在资源管理器部署中创建证书并将其部署到Azure Key Vault?

时间:2016-10-23 14:54:20

标签: azure-service-fabric azure-resource-manager azure-keyvault

我正在尝试从Octopus Deploy自动化流程中部署Azure Service Fabric Cluster。部署新群集的部分过程涉及创建Azure密钥保管库并使用特定于该群集的证书和其他机密填充它。

我有一个ARM模板来部署密钥保管库,另一个用于部署群集。我发现秘密(通常)可以作为ARM模板的一部分部署到Azure Key Vault,但是当秘密是证书时,没有找到有关如何执行此操作的任何信息。理想情况下,我希望创建特定于群集的证书并将其部署到密钥保管库,作为该部署的一部分,因此可以在群集部署期间访问它们,但只需在配置密钥保管库时部署证书就可以了够了。

2 个答案:

答案 0 :(得分:1)

SF部署中使用的证书实际上是在KeyVault中秘密填充的base64编码证书。因此,如果要将它们用于SF部署,您实际上会创建 secret 资源,而不是证书资源。

所以听起来你拥有所需的一切 - 只需在设置keyvault时将base64编码的blob放入秘密值。

那有帮助吗?

答案 1 :(得分:0)

将密钥存储区中的证书部署到VM上需要存储为特定的json文档,我还没有在ARM模板中完成它,但在Powershell中我使用了以下内容:

 $cert = Get-Content $certLocation -Encoding Byte;
    $cert = [System.Convert]::ToBase64String($cert);

    $json = @"
    {
        "data" : "$cert",
        "dataType": "pfx",
        "password": "$password"
    } 
"@

    $package = [System.Text.Encoding]::UTF8.GetBytes($json);
    $package = [System.Convert]::ToBase64String($package);
    $secret = ConvertTo-SecureString -String $package -AsPlainText -Force;

理论上,如果您可以接受这个,然后将$ secret值注入您的ARM模板,那么您应该能够实现您想要做的事情。

请记住,此时的$ password是计划文本,而不是安全字符串,因此Azure Compute可以使用它来安装证书。

然后在您的群集ARM模板中,您可以引用VMSS操作系统配置文件中的证书和密钥保管库:

 "osProfile": {
            "adminUsername": "[parameters('adminUsername')]",
            "adminPassword": "[parameters('adminPassword')]",
            "computernamePrefix": "[parameters('vmNodeType0Name')]",
            "secrets": [
                            {
                                "sourceVault": {
                                    "id": "[parameters('sourceVault')]"
                                },
                                "vaultCertificates": [
                                    {
                                        "certificateStore": "My",
                                        "certificateUrl": "[parameters('clusterCertificateUrl')]"
                                    },
                                    {
                                        "certificateStore": "My",
                                        "certificateUrl": "[parameters('adminCertificateUrl')]"
                                    }
                                ]
                            }
                        ]
          }

然后在Service Fabric Resource属性下的同一ARM模板中引用您要使用的特定证书。

"certificate": {
    "thumbprint": "[parameters('clusterCertificateThumbPrint')]",
    "x509StoreName": "My"
},
"clientCertificateCommonNames": [],
"clientCertificateThumbprints": [{
    "CertificateThumbprint": "[parameters('adminCertificateThumbPrint')]",
    "IsAdmin": true
}],

如果有帮助,这是我在github上尝试的link