2015-11-16 1 views
8

J'ai un tas de chaînes de caractères et de certificats pfx, que je veux stocker dans Azure Key Vault, où seuls les utilisateurs/applications autorisés pourront les obtenir. Il n'est pas difficile de stocker une chaîne en tant que Secret, mais comment puis-je sérialiser un certificat de telle sorte que je puisse le récupérer et le désérialiser en tant qu'objet X509Certificate2 en C#?Comment sérialiser et désérialiser un certificat PFX dans Azure Key Vault?

J'ai essayé de le stocker comme une clé. Voici le code Azure powershell

$securepfxpwd = ConvertTo-SecureString -String 'superSecurePassword' -AsPlainText -Force 
$key = Add-AzureKeyVaultKey -VaultName 'UltraVault' -Name 'MyCertificate' -KeyFilePath 'D:\Certificates\BlaBla.pfx' -KeyFilePassword $securepfxpwd 

Mais quand j'ai essayé de le faire avec la méthode GetKeyAsync, je ne pouvais pas l'utiliser.

Répondre

13

Voici un script PowerShell pour vous. Remplacez le chemin du fichier, le mot de passe, le nom du coffre-fort et le nom secret.

$pfxFilePath = 'C:\mycert.pfx' 
$pwd = '123' 
$flag = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable 
$collection = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2Collection 
$collection.Import($pfxFilePath, $pwd, $flag) 
$pkcs12ContentType = [System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12 
$clearBytes = $collection.Export($pkcs12ContentType) 
$fileContentEncoded = [System.Convert]::ToBase64String($clearBytes) 
$secret = ConvertTo-SecureString -String $fileContentEncoded -AsPlainText –Force 
$secretContentType = 'application/x-pkcs12' 
Set-AzureKeyVaultSecret -VaultName 'myVaultName' -Name 'mySecretName' -SecretValue $Secret -ContentType $secretContentType 

Ceci est une question commune, nous allons donc polir cela et libérer en tant qu'aide.

Le script ci-dessus supprime le mot de passe car il est inutile d'avoir un mot de passe PFX protégé par un mot de passe, puis de stocker le mot de passe à côté de celui-ci.

+1

Le $ clearBytes = $ collection.Export ($ pkcs12ContentType) ne semble pas exporter la clé privée. L'utilisation de la méthode $ collection.Export ($ pkcs12ContentType, $ pwd) m'a permis d'importer le certificat en tant que X509Certificate2 (C#) en utilisant le mot de passe. – Trey

+0

@Sumedh L'assistant auquel vous faites référence est la nouvelle fonctionnalité des certificats Key Vault? https://docs.microsoft.com/en-us/rest/api/keyvault/certificate-scenarios Merci –

+1

@HBoyce oui en effet. Voici un tutoriel pour la fonctionnalité des certificats. Beaucoup plus concis maintenant que le script ci-dessus, et vos certificats restent automatiquement renouvelés. https://blogs.technet.microsoft.com/kv/2016/09/26/get-started-with-azure-key-vault-certificates/ (Merci d'avoir ressuscité ce sujet.) –

0

Voici le script pour le téléchargement certificat PFX en python utilisant cli azur

azure keyvault secret set --vault-name <Valut name> --secret-name <Secret Name> --value <Content of PFX file> 

Obtenir le contenu du fichier PFX en python

fh = open(self.getPfxFilePath(), 'rb') 
    try: 
     ba = bytearray(fh.read()) 
     cert_base64_str = base64.b64encode(ba) 
     password = self.getPassword() 
     json_blob = { 
      'data': cert_base64_str, 
      'dataType': 'pfx', 
      'password': password 
     } 
     blob_data= json.dumps(json_blob) 
     content_bytes= bytearray(blob_data) 
     content = base64.b64encode(content_bytes) 
     return content 
    finally: 
     fh.close 
    fh.close() 
+0

Downvote. La question portait sur la récupération en tant qu'objet 'x509Certificate2' utilisant C#. – McGuireV10

1

La question initiale a demandé comment récupérer le PFX stocké sous forme de un objet X509Certificate2. En utilisant un processus Base64 similaire à celui publié par Sumedh Barde ci-dessus (ce qui a l'avantage de supprimer le mot de passe), le code suivant retournera un objet X509. Dans une application réelle, le KeyVaultClient doit être mis en cache si vous récupérez plusieurs secrets, et les secrets individuels doivent également être mis en cache.

public static async Task<X509Certificate2> GetSecretCertificateAsync(string secretName) 
{ 
    string baseUri = @"https://xxxxxxxx.vault.azure.net/secrets/"; 

    var provider = new AzureServiceTokenProvider(); 
    var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(provider.KeyVaultTokenCallback)); 
    var secretBundle = await KeyVaultClient.GetSecretAsync($"{baseUri}{secretName}").ConfigureAwait(false); 
    string pfx = secretBundle.Value; 

    var bytes = Convert.FromBase64String(pfx); 
    var coll = new X509Certificate2Collection(); 
    coll.Import(bytes, null, X509KeyStorageFlags.Exportable); 
    return coll[0]; 
} 
+1

C'est exactement ça. Rappelez-vous que vous devez enregistrer votre clé dans la section 'secrets' de votre keyvault et non dans la section' keys' de votre keyvault – ElFik

+0

Ils auraient vraiment dû nommer la section keys pour mieux clarifier qu'elle est destinée au partage et à la rotation automatiques des clés publiques, par rapport au stockage de clés à usage général ... – McGuireV10