C# 如何根据指纹检索KeyVault证书

C# 如何根据指纹检索KeyVault证书,c#,azure-keyvault,C#,Azure Keyvault,我正在尝试做一些简单的事情(至少我希望如此),如何在Azure KeyVault中基于指纹检索证书 我们的系统检索一个签名的JWToken,在它的头上包含“kid”,其中包含JWToken被签名的证书的指纹。我需要根据指纹找到证书进行验证。使用Azure KeyVault SDK(C#core)似乎无法根据指纹检索证书 由于证书可能有不同的版本(每个版本都有不同的指纹),因此我不能使用wait client.GetSecretAsync(KvBaseUrl,CertificateName)。我创

我正在尝试做一些简单的事情(至少我希望如此),如何在Azure KeyVault中基于指纹检索证书

我们的系统检索一个签名的JWToken,在它的头上包含“kid”,其中包含JWToken被签名的证书的指纹。我需要根据指纹找到证书进行验证。使用Azure KeyVault SDK(C#core)似乎无法根据指纹检索证书

由于证书可能有不同的版本(每个版本都有不同的指纹),因此我不能使用
wait client.GetSecretAsync(KvBaseUrl,CertificateName)
。我创建了以下代码:

public async静态任务GetCertificateByThumbprintAsync(此KeyVault客户端,字符串kvBaseUrl,字符串certificateName,字符串指纹)
{
var allversionsasgettask=(wait client.getCertificateVersionsAsAsSync(kvBaseUrl,certificateName).configurewait(false))
.Select(x=>client.GetCertificateAsync(x.Identifier.Identifier))
.ToList();
var allCertificates=await Task.WhenAll(allversionsasgettask.ConfigureAwait(false);
var correctCertificate=allCertificates.Select(x=>newx509Certificate2(x.Cer))
.FirstOrDefault(x=>x.Thumbprint==指纹);
if(correctCertificate==null)
抛出新异常(未找到指纹为“{thumbprint}”的$”证书);
退货证明;
}
我拿到了证书,但似乎要做很多工作,还要对KeyVault进行很多不必要的调用(任务
Task.whalll
code)

有更简单的方法吗?

client.GetCertificateVersionsAsync(..)
代码返回一个
CertificateItem
,其中包含类型为
byte[]
的X509Thumbprint属性。我似乎无法将
字节[]
转换为字符串。我尝试了Base64和UTF8,但都给出了一个奇怪的结果,没有包含指纹

更新

多亏了一位同事,我们找到了一种更快的方法来检索正确的证书


公共异步静态任务GetCertificateByThumbprintAsync(此KeyVault客户端,字符串kvBaseUrl,字符串certificateName,字符串指纹)
{
var certificateVersion=(等待客户端.GetCertificateVersionsAsync(kvBaseUrl,certificateName).ConfigureWait(false))
.FirstOrDefault(x=>BitConverter.ToString(x.X509Thumbprint)。替换(“-”,“”)=thumbprint);
if(certificateVersion==null)
抛出新异常(未找到指纹为“{thumbprint}”的$”证书);
返回wait-client.GetCertificateAsync(certificateVersion.Identifier.Identifier);
}
更新2 我们正在使用Azure托管身份访问KeyVault。我们正在使用以下代码:

private异步任务GetClientAsync()
{
var provider=新AzureServiceTokenProvider();
logger.LogInformation(“尝试检索用于KeyVault通信的令牌”);
尝试
{
等待提供程序。GetAccessTokenAsync(“https://vault.azure.net“”。配置等待(错误);
logger.LogInformation(“收到钥匙库令牌”);
}
捕获(例外)
{
logger.LogError(“无法检索KeyVault通信的访问权限”);
投掷;
}
返回新的KeyVaultClient(newauthenticationcallback(provider.KeyVaultTokenCallback));
}

感谢您的更新,我正在努力构建KeyVaultClient,但找不到有关.net core的直接示例,能否将其作为问题的一部分进行分享?@Marzouk我已更新了问题以创建KeyVaultClient。我希望有帮助。