Olá pessoal,
Venho precisado com uma certa frequencia, baixar certificados do Key Vault do Azure via linha de comando para baixar certificados em lote ou para alguma automação, para isso acabei escrevendo um script que usa o modulo de powershell do Azure para listar as informações diretamente do key vault.
Antes de mais nada é necessário autenticar na subscrição do azure utilizando o comando Add-AzAccount, feito isso será possivel dar sequencia com o script abaixo. lembrando tambem que a conta que for utilizada para autenticar deve ter acesso de GET e LIST em certificados e segredos na Politica de acessos do Key vault. Tendo isso em mente podemos iniciar o processo.
Recuperando as informaçoes do certificado:
$cert = Get-AzKeyVaultCertificate -VaultName $VaultName -Name $CertificateName
Recuperando o segredo associado ao certificado(contém a chave privada):
$kvSecret = Get-AzKeyVaultSecret -VaultName $VaultName -Name $Cert.Name
Convertendo o segredo de string base64:
$kvSecretBytes = [System.Convert]::FromBase64String($kvSecret.SecretValueText)
Criando um objeto do tipo X509Certificate2Collection para importar o certificado em memória:
$certCollection = New-Object -TypeName 'System.Security.Cryptography.X509Certificates.X509Certificate2Collection'
Importando o Certificado convertido para a collection:
$certCollection.Import($kvSecretBytes,$null,[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
Gerando o export do certificado em memória, nesse momento ele esta em formato de array de bytes como se fosse um memory stream:
$protectedCertificateBytes = $certCollection.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $password)
Resolvendo o caminho aonde o arquivo será salvo:
$pfxPath = Join-Path -Path $([Environment]::GetFolderPath("Desktop")) -ChildPath "\$CertificateName.pfx"
Por fim, utilizando o WriteAllBytes do System.File.IO para salvar da memória para o disco:
[System.IO.File]::WriteAllBytes($pfxPath, $protectedCertificateBytes)
Script completo:
$VaultName = 'Nome do Key Vault'
$CertificateName = 'Nome do Certificado no Key Vault'
$password = 'Senha para o arquivo PFX que sera gerado'
$cert = Get-AzKeyVaultCertificate -VaultName $VaultName -Name $CertificateName
$kvSecret = Get-AzKeyVaultSecret -VaultName $VaultName -Name $Cert.Name
$kvSecretBytes = [System.Convert]::FromBase64String($kvSecret.SecretValueText)
$certCollection = New-Object -TypeName 'System.Security.Cryptography.X509Certificates.X509Certificate2Collection'
$certCollection.Import($kvSecretBytes,$null,[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
$protectedCertificateBytes = $certCollection.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $password)
$pfxPath = Join-Path -Path $([Environment]::GetFolderPath("Desktop")) -ChildPath "\$CertificateName.pfx"
[System.IO.File]::WriteAllBytes($pfxPath, $protectedCertificateBytes)
Dúvidas? Sugestões? Comente!
Até a próxima!