web-dev-qa-db-fra.com

Comment sérialiser et désérialiser un certificat PFX dans Azure Key Vault?

J'ai un tas de chaînes et de certificats pfx, que je souhaite stocker dans le coffre-fort Azure Key, 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 manière à pouvoir le récupérer et le désérialiser sous la forme d'un objetX509Certificate2en C #?

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 lorsque j'ai essayé de l'obtenir avec la méthodeGetKeyAsync, je ne pouvais pas l'utiliser.

12
zdebyman

Voici un script PowerShell pour vous. Remplacez le chemin du fichier, le mot de passe, le nom du coffre-fort, 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

C’est une question courante, nous allons donc la peaufiner et la publier comme aide.

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

12
Sumedh Barde

La question initiale demandait comment récupérer le PFX stocké en tant qu'objet X509Certificate2. En utilisant un processus Base64 similaire à celui posté par Sumedh Barde ci-dessus (qui a l'avantage de supprimer le mot de passe), le code suivant renverra un objet X509. Dans une application réelle, la variable KeyVaultClient doit être mise 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];
}
5
McGuireV10

Voici le script permettant de télécharger un certificat pfx en python à l'aide d'Azure cli 

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
Raghu K Nair