如何在 Azure Key Vault 中序列化和反序列化 PFX 证书?
How to serialize and deserialize a PFX certificate in Azure Key Vault?
我有一堆字符串和 pfx 证书,我想将它们存储在 Azure Key vault 中,只有允许 users/apps 才能获取它们。将字符串存储为 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方法获取时,我无法使用它。
这是为您准备的 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 然后将密码存储在它旁边没有任何价值。
这是使用 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()
最初的问题询问如何将存储的 PFX 检索为 X509Certificate2
对象。使用类似于上面 Sumedh Barde 发布的 Base64 过程(具有剥离密码的优点),以下代码将 return 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];
}
这是我解决这个问题的方法。首先,将您的 PFX 文件转换为 base64 字符串。您可以使用这两个简单的 PowerShell 命令执行此操作:
$fileContentBytes = get-content 'certificate.pfx' -Encoding Byte
[System.Convert]::ToBase64String($fileContentBytes) | Out-File 'certificate_base64.txt'
通过 Azure Portal. Copy the certificate base64 string that you created previously and paste it in the secret value field in your Azure Key Vault via the 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];
}
请参阅以下答案,其中描述了如何使用最新的 .NET Azure SDK 客户端库执行此操作:
How can I create an X509Certificate2 object from an Azure Key Vault KeyBundle
我有一堆字符串和 pfx 证书,我想将它们存储在 Azure Key vault 中,只有允许 users/apps 才能获取它们。将字符串存储为 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方法获取时,我无法使用它。
这是为您准备的 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 然后将密码存储在它旁边没有任何价值。
这是使用 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()
最初的问题询问如何将存储的 PFX 检索为 X509Certificate2
对象。使用类似于上面 Sumedh Barde 发布的 Base64 过程(具有剥离密码的优点),以下代码将 return 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];
}
这是我解决这个问题的方法。首先,将您的 PFX 文件转换为 base64 字符串。您可以使用这两个简单的 PowerShell 命令执行此操作:
$fileContentBytes = get-content 'certificate.pfx' -Encoding Byte
[System.Convert]::ToBase64String($fileContentBytes) | Out-File 'certificate_base64.txt'
通过 Azure Portal. Copy the certificate base64 string that you created previously and paste it in the secret value field in your Azure Key Vault via the 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];
}
请参阅以下答案,其中描述了如何使用最新的 .NET Azure SDK 客户端库执行此操作:
How can I create an X509Certificate2 object from an Azure Key Vault KeyBundle