Можно ли создать сертификаты и развернуть их в хранилище ключей Azure как часть развертывания Resource Manager?

Я пытаюсь развернуть кластер Azure Service Fabric в автоматизированном процессе из Octopus Deploy. Часть процесса развертывания нового кластера включает создание хранилища ключей Azure и заполнение его сертификатами и другими секретами, относящимися к этому кластеру.

У меня есть шаблон ARM для развертывания Key Vault и еще один для развертывания кластера. Я обнаружил, что секреты (в целом) могут быть развернуты в Azure Key Vault как часть шаблона ARM, но не нашел никакой информации о том, как это сделать, когда секрет - это сертификат. В идеале я хотел бы создать и развернуть сертификаты для конкретного кластера в Key Vault как часть этого развертывания, чтобы к ним можно было получить доступ во время развертывания кластера, но просто возможность развернуть сертификаты при подготовке Key Vault было бы более чем хорошо. достаточно.


person alastairs    schedule 23.10.2016    source источник


Ответы (2)


Сертификаты, используемые при развертывании SF, на самом деле являются сертификатами в кодировке base64, заполненными секретом в KeyVault. Таким образом, вы фактически должны создать ресурс секрет, а не ресурс сертификата, если хотите использовать их для развертывания SF.

Похоже, у вас есть все необходимое - просто поместите этот blob в кодировке base64 в секретное значение при настройке keyvault.

Это поможет?

person bmoore-msft    schedule 24.10.2016
comment
Спасибо @ bmoore-msft, я думаю, это поможет мне сделать еще один шаг вперед. Дам это попробовать. - person alastairs; 26.10.2016

Развертывание сертификатов из хранилища ключей на виртуальную машину должно храниться как конкретный документ 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 может использовать его для установки сертификатов.

Затем в шаблоне 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')]"
                                    }
                                ]
                            }
                        ]
          }

Затем в том же шаблоне ARM в свойствах ресурса Service Fabric укажите конкретные сертификаты, которые вы хотите использовать.

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

Если это поможет, вот ссылка на мою попытку на github

person jimpaine    schedule 24.10.2016
comment
Спасибо @jimpaine, похоже, это полезно. Я отвечу больше, когда у меня будет возможность попробовать это снова. - person alastairs; 26.10.2016