6
votes

Obtenir la dernière version d'un certificat à partir d'un coffre de clés Azure dans un modèle ARM

Création d'un modèle ARM qui doit installer un certificat SSL situé à l'intérieur d'un coffre de clés Azure. Si je spécifie le certificat avec l'empreinte numérique, cela fonctionne bien:

"secrets": [
    {
      "sourceVault": {
        "id": "[resourceId(parameters('keyVaultResourceGroupName'), 'Microsoft.KeyVault/vaults', parameters('keyVaultName'))]"
      },
      "vaultCertificates": [
        {
          "certificateUrl": "https://contoso.vault.azure.net/secrets/web01-test-contoso-com/latest",
          "certificateStore": "My"
        }
      ]
    }
]

Mais comme un certificat est sur une horloge, cela code en dur une dépendance qui peut devenir obsolète dans le modèle ARM. Je préfère simplement spécifier la dernière version (comme cela apparaît dans le portail). Cependant, je n'ai trouvé aucune documentation qui montre comment faire cela ou même mentionne si c'est possible.

J'ai effectué quelques expériences en utilisant:

message '{
   "error": {
     "code": "InvalidParameter",
     "message": "https://contoso.vault.azure.net/secrets/web01-test-contoso-com/latest is 
 not a valid versioned Key Vault Secret URL. It should be in the format 
 https://<vaultEndpoint>/secrets/<secretName>/<secretVersion>.",
     "target": "certificateUrl"
   }
}'

et

https://contoso.vault.azure.net/secrets/web01-test-contoso-com/latest

Mais dans les deux cas, j'ai eu le même message d'erreur:

https://contoso.vault.azure.net/secrets/web01-test-contoso-com

Ma question est donc : Comment puis-je référencer le certificat de manière à obtenir la dernière version?

Pour plus de clarté, j'utilise l'URL dans la section secrets du modèle ARM pour une machine virtuelle comme suit, qui obtient le certificat du coffre de clés Azure et l'installe dans le magasin de certificats Windows.

https://contoso.vault.azure.net/secrets/web01-test-contoso-com/968bf207451149d3aceb390065af9d3a

REMARQUE: Je trouverais étrange que vous puissiez spécifier la dernière version d'un système d'exploitation à installer, mais vous ne pouvez pas spécifier d'installer la dernière version d'un certificat.


2 commentaires

Dans le cas où cela n'est pas possible, vous pouvez écrire un script qui effectue cette opération après le déploiement d'ARM.


Dans votre pipeline, ajoutez un script qui obtient la dernière version, puis transmettez-le en tant que paramètre dans le modèle arm.


3 Réponses :


1
votes

Il n'y a pas de moyen direct \ facile de le faire. Key Vault n'est pas vraiment compatible avec les modèles de bras.

Comme juunas l'a proposé, vous pouvez écrire un script ou utiliser une extension de script personnalisée pour extraire ces données directement du coffre de clés en utilisant l'identité de service géré, par exemple.


0 commentaires

0
votes

D'après la réponse de @ 4c74356b41, je l'ai fait moi-même en script python.

      data = json.loads(kv_auth_response.content)
      #
      ## Lets find youngest vesrion of certificate
      #
      if len(data['value']) > 0:
         for x in range(len(data['value'])):
             if x == 0:
                youngest = data['value'][x]['attributes']['exp']
                cert_url = data['value'][x]
             if data['value'][x]['attributes']['exp'] > youngest:
                youngest = data['value'][x]['attributes']['exp']
                cert_url = data['value'][x]
         arry = cert_url['id'].split('/')
...
         cert_version = arry[len(arry)-1]

À la première étape de la boucle, la valeur de la date d'expiration est affectée à la variable "la plus jeune". Dans les étapes suivantes, le script compare la date d'expiration à celle-ci et attribue le moment où la condition est remplie. Après la boucle, le script se sépare avec "yougests" cert_url et assigne la dernière partie du tableau à la variable "cert_version".

Vous pouvez voir une vue complète de ce problème dans mon script à BYOC pour le domaine personnalisé. Lien: https: // github. com / przemika / azure-byoc-pour-domaine-personnalisé / blob / master / start-byoc.py


0 commentaires

4
votes

C'est possible, contrairement à ce que dit la réponse acceptée. Définissez la variable avec l'ID de ressource de secret comme ceci, par exemple:

"certificateUrl": "[reference(variables('mySecretResourceId'), '2018-02-14').secretUriWithVersion]"

puis vous pouvez l'utiliser dans votre modèle comme suit:

"mySecretResourceId": "[concat(resourceGroup().id,'/providers/Microsoft.KeyVault/vaults/', variables('keyVaultName'), '/secrets/', 'my-secret-name')]"


2 commentaires

peut être simplifié: resourceId ('Microsoft.KeyVault / voults / secrets', 'kvname', 'secret name') . belle prise cependant


non, ce n'est pas vrai, peu importe si la ressource existe. resourceId () fonctionnera toujours