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.
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é.
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];
}
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()