【发布时间】:2020-03-25 17:34:26
【问题描述】:
我正在尝试从 Azure Keyvault 获取证书,然后使用它来调用需要证书进行身份验证的 REST API。
我已尝试在本地执行此操作 - 我在磁盘上有 .pfx 文件,我将其加载到字节数组中,然后从中创建我的证书:
X509Certificate2 x509 = new X509Certificate2(File.ReadAllBytes(path), password);
然后在 RestSharp 中使用该证书进行我的 REST 调用:
IRestClient client = new RestClient(url);
client.ClientCertificates = new X509CertificateCollection { x509 };
var request = new RestRequest(lastUrlPart, Method.GET);
request.AddHeader("Cache-Control", "no-cache");
request.AddHeader("Accept", "application/json");
request.AddHeader("Content-Type", "application/json");
IRestResponse response = client.Execute(request);
if (response.IsSuccessful)
{
// read out the response and process it
}
像魅力一样工作。
现在我正在尝试做同样的事情,但从 Azure Keyvault 获取证书。我在 Azure AD 中创建了一个应用注册,创建了我的 keyvault,并为我的应用注册的服务标识授予了对 keyvault 的访问权限。我已将证书上传到密钥库中。到目前为止,一切顺利。
我找到了从 Keyvault 获取证书的代码:
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var kv = new KeyVaultClient(async (authority, resource, scope) =>
{
var authContext = new AuthenticationContext(authority, TokenCache.DefaultShared);
var clientCred = new ClientCredential(clientAppId, clientSecret);
var result = await authContext.AcquireTokenAsync(resource, clientCred);
if (result == null)
{
throw new InvalidOperationException("Failed to obtain the JWT token");
}
return result.AccessToken;
});
string certIdentifier = "https://mykeyvault.vault.azure.net/certificates/Certificate-TEST/14753af7586445fe9d57efa136ac090c";
var vaultCertificate = kv.GetCertificateAsync(certIdentifier).GetAwaiter().GetResult();
这也有效 - 我可以使用我的应用程序身份访问 keyvault,我可以从 keyvault 获取证书,并且 X.509 指纹是有效的 - 但现在这是来自 Microsoft.Azure.KeyVault.Models 命名空间的 CertificateBundle - 如何将其“转换”为“常规”X509Certificate2 对象,以便可以将其用于 REST 调用?
例如,我已经尝试了几件事
X509Certificate2 x509 = new X509Certificate2(vaultCertificate.Cer);
但没有任何效果 - 当我进行 REST 调用时,我收到 HTTP 403 - Forbidden 错误返回......
我错过了什么?如何从 Azure Keyvault 获取可用于在后续 REST 调用中进行身份验证的格式的证书??
【问题讨论】:
标签: rest x509certificate azure-keyvault