15

許可されたユーザー/アプリのみが取得できる Azure Key Vault に格納したい文字列と pfx 証明書がたくさんあります。文字列を Secret として保存するのは難しくありませんが、証明書を取得してC# でX509Certificate2オブジェクトとして逆シリアル化できるように、証明書をシリアル化するにはどうすればよいでしょうか?

鍵として収納してみました。Azure PowerShell コードは次のとおりです。

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

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

4

5 に答える 5

14

これが 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 を保持し、パスワードをその横に保存しても意味がないため、パスワードを削除します。

于 2015-12-09T18:56:07.607 に答える
9

元の質問では、保存された 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];
}
于 2018-01-10T16:38:44.037 に答える
0

これは、azure cli を使用して Python で 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()
于 2017-01-09T19:57:18.890 に答える