2015-11-16 7 views
8

Ho un mucchio di stringhe e certificati pfx, che voglio memorizzare in Azure Key vault, dove solo gli utenti/app consentiti potranno riceverli. Non è difficile memorizzare una stringa come Segreto, ma come posso serializzare un certificato in modo tale da poterlo recuperare e deserializzare come oggetto X509Certificate2 in C#?Come serializzare e deserializzare un certificato PFX in Azure Key Vault?

Ho provato a memorizzarlo come chiave. Ecco il codice PowerShell Azure

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

Ma quando ho cercato di ottenere con il metodo GetKeyAsync, non ho potuto usarlo.

risposta

13

Ecco uno script PowerShell per te. Sostituisci il percorso del file, la password, il nome del vault, il nome segreto.

$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 

Questa è una domanda comune, quindi la lucideremo e la rilasciamo come aiuto.

Lo script sopra rimuove la password perché non c'è alcun valore nell'avere un PFX protetto da password e quindi memorizzare la password accanto ad esso.

+1

$ clearBytes = $ collection.Export ($ pkcs12ContentType) non sembra esportare la chiave privata. L'utilizzo del metodo $ collection.Export ($ pkcs12ContentType, $ pwd) mi ha permesso di importare il certificato come X509Certificate2 (C#) usando la password. – Trey

+0

@Sumedh L'helper a cui ti riferisci è che i nuovi certificati Key Vault sono disponibili? https://docs.microsoft.com/en-us/rest/api/keyvault/certificate-scenarios Grazie –

+1

@Hoyce sì sì. Ecco un tutorial per la funzionalità dei certificati. Molto più conciso ora rispetto allo script sopra, e anche i certificati rimangono auto-rinnovati. https://blogs.technet.microsoft.com/kv/2016/09/26/get-started-with-azure-key-vault-certificates/ (Grazie per resuscitare questa discussione.) –

0

Ecco lo script per il caricamento del certificato PFX in Python usando CLI azzurro

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

Ottenere il contenuto del file PFX in 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 domanda riguardava il recupero come oggetto 'x509Certificate2' usando C#. – McGuireV10

1

La domanda iniziale chiesto come recuperare la stored PFX come un oggetto X509Certificate2. Utilizzando un processo Base64 simile a quello pubblicato da Sumedh Barde sopra (che ha il vantaggio di rimuovere la password), il codice seguente restituirà un oggetto X509. In un'applicazione reale, lo KeyVaultClient deve essere memorizzato nella cache se si stanno recuperando più segreti e anche i singoli segreti devono essere memorizzati nella 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

Questo è esattamente giusto. Ricorda che devi salvare la tua chiave nella sezione 'secrets' del tuo keyvault e non nella sezione' keys' di you keyvault – ElFik

+0

Dovrebbero davvero aver chiamato la sezione keys qualcosa che meglio ha chiarito che è pensata per la condivisione e rotazione automatica delle chiavi pubbliche, versus memorizzazione di chiavi per uso generico ... – McGuireV10

Problemi correlati