¿Cómo serializar y deserializar un certificado PFX en Azure Key Vault?

Tengo un montón de cadenas y certificados pfx, que quiero almacenar en Azure Key Vault, donde solo los usuarios / aplicaciones permitidos pueden obtenerlos. No es difícil almacenar una cadena como un Secreto, pero ¿cómo puedo serializar un certificado de tal manera que pueda recuperarlo y deserializarlo como un objeto X509Certificate2 en C #?

Traté de almacenarlo como una clave. Aquí está el código de Azure PowerShell

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

Pero cuando traté de obtenerlo con el método GetKeyAsync , no pude usarlo.

Aquí hay un script de PowerShell para ti. Reemplace la ruta del archivo, la contraseña, el nombre de la bóveda, el nombre secreto.

 $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 

Esta es una pregunta común, por lo que vamos a pulir esto y lanzarlo como ayudante.

El script anterior borra la contraseña porque no tiene ningún valor tener una PFX protegida por contraseña y luego almacenar la contraseña junto a ella.

La pregunta original preguntaba cómo recuperar el PFX almacenado como un objeto X509Certificate2 . Usando un proceso de Base64 similar al publicado por Sumedh Barde arriba (que tiene la ventaja de quitar la contraseña), el siguiente código devolverá un objeto X509. En una aplicación real, KeyVaultClient debe almacenarse en caché si está recuperando varios secretos, y los secretos individuales también deben almacenarse en caché.

 public static async Task 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]; } 

Aquí está la secuencia de comandos para cargar el certificado pfx en python utilizando azur cli

 azure keyvault secret set --vault-name  --secret-name  --value  

Obtener el contenido del archivo 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()