使用azure密钥保管库服务获取RSA256私钥和公钥



我正在尝试使用Azure密钥库云服务。我遵循了一些msdn文章,在azure密钥库中创建了一个密钥。

这是我的代码

public async Task<RSA256Key> GenerateRSAKey(string keyName)
{
using (KeyVaultClient client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetToken))) //GetToken returns access token to connect to Azure key vault
{
var newKeyParams = new NewKeyParameters()
{
Kty = "RSA",
CurveName= "P-256",
KeySize = 2048
};
KeyBundle rsa = await client.CreateKeyAsync(_config.VaultUrl, keyName, newKeyParams);

}
}

这个代码运行良好,它在azure keyvault中创建了一个密钥。我想从使用上述代码生成的密钥中获取公钥和私钥。KeyBundle响应具有JsonWebKey属性。我检查了这个属性,发现在N和E上都有值。

{
"kid": "https://xxxx.vault.azure.net/keys/yyyy/zzzz",
"kty": "RSA",
"n": "wt1SiRuybjkoVwgbUJgHJY9W1WFDMHOzhKx3ewISCINWFgiH5RHOhGDqoIfFVuwGMk0mmnNXdVCFFrATYUPT0EhXqCv_9IDXSh9WW1VvvsZBp0nW1v8e80Mz_nDZ1DVgC2KY8G97JVyfomm6nZRcBVkklimmZEDl_oPpFg68rfnEz4qou-4DNMoF2k9U95xXZfusrFpP5IJnHaMqsCQTozIWu65sWv3I5sW3zRmx93nQWAbf0_FEf70SQ8qgDtP8IVKS7xd05epQkbPsPtI8KwW4tVUsmP7EJYaMxCvT-Y_bpdliwEWxIMTp6cwo3l7AWvb8YyAhPC1Z02Cliweo5Q",
"e": "AQAB"
}

我想使用RSA 256私钥来签署JWT。

一旦导入/生成密钥,就无法下载密钥的私有部分。您可以将本文作为的示例

第二,说到公钥,只有公钥对系统可用。对GetKeyAsync的API调用未返回私钥数据。这就是DecryptAsync包装方法使用密钥保管库API进行解密的原因。换句话说,私钥永远不会离开保管库,这也是使用密钥保管库进行解密而不是将私钥带入解密过程的原因之一。

作为一个选项,您可以自己生成密钥对并保存私钥

using Azure.Identity;
using Azure.Security.KeyVault.Keys;
var vaultUri = new Uri("https://{kv-name}.vault.azure.net/");
var keyClient = new KeyClient(vaultUri, new DefaultAzureCredential());
// Generate key
var generatedKey = RSA.Create();
// You can save a private key
// var privateKey = generatedKey.ExportRSAPrivateKey();
var webKey = new JsonWebKey(generatedKey, includePrivateParameters: true);
var response = await keyClient.ImportKeyAsync(new ImportKeyOptions("name", webKey));

但如果你想在Azure中存储公钥和私钥,我建议你将它们作为证书存储。在这种情况下,可以直接从Azure 访问具有公钥和私钥的证书

using Azure.Identity;
using Azure.Security.KeyVault.Certificates;
var certClient = new CertificateClient(vaultUri, new DefaultAzureCredential());

X509Certificate2 cert = ...
...
var importCertOptions = new ImportCertificateOptions("name", cert.RawData);
var response = await certClient.ImportCertificateAsync(importCertOptions);

最新更新