4

Je tente de créer un certificat auto-signé dans KeyVault en utilisant l'émetteur "Self". Cependant, lors de la récupération du certificat, il ne semble pas avoir de clé privée.Certificat KeyVault généré avec une clé privée exportable

La création de certificats directement dans KeyVault ne semble pas avoir été largement couverte en ligne, après avoir découvert la documentation de l'API restante et le code source des cmdlets powershell, je suis perplexe.

J'espère que c'est quelque chose de simple que je l'ai manqué, que je souhaite éviter de créer le certificat localement ..

Répondre

6

Si vous souhaitez récupérer votre certificat avec sa clé privée, vous pouvez exporter dans un fichier PFX (avec un mot de passe vide) sur votre disque via:

$vaultName = "my-vault-name" 
$certificateName = "my-cert-name" 
$pfxPath = [Environment]::GetFolderPath("Desktop") + "\$certificateName.pfx" 

$pfxSecret = Get-AzureKeyVaultSecret -VaultName $vaultName -Name $certificateName 
$pfxUnprotectedBytes = [Convert]::FromBase64String($pfxSecret.SecretValueText) 
[IO.File]::WriteAllBytes($pfxPath, $pfxUnprotectedBytes) 

Si vous souhaitez afficher simplement la clé privée lui-même en mémoire sans écriture sur le disque, essayez:

$vaultName = "my-vault-name" 
$certificateName = "my-cert-name" 
$pfxPath = [Environment]::GetFolderPath("Desktop") + "\$certificateName.pfx" 

$pfxSecret = Get-AzureKeyVaultSecret -VaultName $vaultName -Name $certificateName 
$pfxUnprotectedBytes = [Convert]::FromBase64String($pfxSecret.SecretValueText) 
$pfx = New-Object Security.Cryptography.X509Certificates.X509Certificate2 
$pfx.Import($pfxUnprotectedBytes, $null, [Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable) 
$pfx.PrivateKey.ExportParameters($true) 

qui montrera les paramètres privés en plus de l'exposant et du module.

Si vous souhaitez protéger le fichier PFX sur le disque avec votre propre mot de passe (en suivant les instructions « Récupérer fichier PFX & ajouter un mot de passe retour » dans this blog post), essayez:

$vaultName = "my-vault-name" 
$certificateName = "my-cert-name" 
$pfxPath = [Environment]::GetFolderPath("Desktop") + "\$certificateName.pfx" 
$password = "my-password" 

$pfxSecret = Get-AzureKeyVaultSecret -VaultName $vaultName -Name $certificateName 
$pfxUnprotectedBytes = [Convert]::FromBase64String($pfxSecret.SecretValueText) 
$pfx = New-Object Security.Cryptography.X509Certificates.X509Certificate2 
$pfx.Import($pfxUnprotectedBytes, $null, [Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable) 
$pfxProtectedBytes = $pfx.Export([Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $password) 
[IO.File]::WriteAllBytes($pfxPath, $pfxProtectedBytes) 

Comme indiqué dans les documents de l'API REST here et here, Azure Key Vault (AKV) représente un certificat X.509 donné via trois ressources interdépendantes: un certificat AKV, une clé AKV et un secret AKV. Tous les trois partagent le même nom et la même version - pour vérifier cela, examinez les propriétés Id, KeyId et SecretId dans la réponse de Get-AzureKeyVaultCertificate.

Chacun de ces 3 ressources offrent une perspective différente pour l'affichage d'un X.509 donné cert:

  • Le AKV certificat fournit les métadonnées de clé publique et cert du certificat X.509. Il contient le module et l'exposant de la clé publique (n et e), ainsi que d'autres métadonnées de cert (empreinte, date d'expiration, nom du sujet, etc.). Dans PowerShell, vous pouvez obtenir ce via:
(Get-AzureKeyVaultCertificate -VaultName $vaultName -Name $certificateName).Certificate 
  • La clé AKV fournit la clé privée du certificat X.509. Cela peut être utile pour effectuer des opérations cryptographiques telles que la signature si le certificat correspondant a été marqué comme non exportable.Dans PowerShell, vous ne pouvez obtenir la partie publique de cette clé privée via:
(Get-AzureKeyVaultKey -VaultName $vaultName -Name $certificateName).Key 
  • Le AKV secret fournit un moyen de exporter le certificat complet X.509, y compris son privé clé (si sa politique autorise l'exportation de clés privées). Comme démontré ci-dessus, le certificat codé en base64 en cours peut être obtenu via PowerShell:
(Get-AzureKeyVaultSecret -VaultName $vaultName -Name $certificateName).SecretValueText 
+1

réponse très complète, merci Adriano! J'avais commencé à réaliser que j'avais besoin de retrouver le secret car l'API powershell n'est pas la plus simple à comprendre - le .Certificat est un piège :-) cela a bien expliqué les choses! –