web-dev-qa-db-ja.com

Azure Key VaultでPFX証明書をシリアル化および逆シリアル化する方法?

一連の文字列とpfx証明書をAzure Key Vaultに保存したいのですが、許可されたユーザー/アプリのみがそれらを取得できます。文字列をシークレットとして保存することは難しくありませんが、証明書を取得してX509Certificate2C#のオブジェクト?

キーとして保管してみました。これはAzure PowerShellのコードです

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

しかし、GetKeyAsyncメソッドで取得しようとすると、使用できませんでした。

14
zdebyman

これがPowerShellスクリプトです。ファイルパス、パスワード、ボールト名、シークレット名を置き換えます。

$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

これはよくある質問なので、これを磨いてヘルパーとしてリリースします。

上記のスクリプトは、パスワードでPFXを保護し、その横にパスワードを保存することに意味がないため、パスワードを削除します。

12
Sumedh Barde

元の質問では、保存されているPFXをX509Certificate2オブジェクトとして取得する方法を尋ねていました。上記のSumedh Bardeによって投稿されたものと同様のBase64プロセスを使用すると(パスワードを取り除く利点があります)、次のコードはX509オブジェクトを返します。実際のアプリケーションでは、複数のシークレットを取得する場合はKeyVaultClientをキャッシュし、個々のシークレットもキャッシュする必要があります。

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 client.GetSecretAsync($"{baseUri}{secretName}").ConfigureAwait(false);
    string pfx = secretBundle.Value;

    var bytes = Convert.FromBase64String(pfx);
    var coll = new X509Certificate2Collection();
    coll.Import(bytes, "certificatePassword", X509KeyStorageFlags.Exportable);
    return coll[0];
}
8
McGuireV10

これが私がこれを解決した方法です。まず、PFXファイルをbase64文字列に変換します。これは、次の2つの簡単なPowerShellコマンドで実行できます。

$fileContentBytes = get-content 'certificate.pfx' -Encoding Byte
[System.Convert]::ToBase64String($fileContentBytes) | Out-File 'certificate_base64.txt'

Azure Portal を使用してAzure Key Vaultにシークレットを作成します。以前に作成した証明書のbase64文字列をコピーし、 Azure Portal を介してAzure Key Vaultのシークレット値フィールドに貼り付けます。次に、コードからAzure Key Vaultを呼び出して、base64文字列値を取得し、それをX509Certificate2に変換します。

private async Task<X509Certificate2> GetCertificateAsync()
{
    var azureServiceTokenProvider = new AzureServiceTokenProvider();
    var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
    var secret = await keyVaultClient.GetSecretAsync("https://path/to/key/vault").ConfigureAwait(false);
    var pfxBase64 = secret.Value;
    var bytes = Convert.FromBase64String(pfxBase64);
    var coll = new X509Certificate2Collection();
    coll.Import(bytes, "certificatePassword", X509KeyStorageFlags.Exportable);
    return coll[0];
}
1
Sirar Salih

python Azure Azure CLIを使用してPFX証明書をアップロードするためのスクリプトは次のとおりです

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

PythonでPFXファイルのコンテンツを取得する

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