Azure Key Vault:部署后无法从kv获取证书

时间:2018-09-11 18:34:59

标签: azure certificate azure-keyvault

我有一个webjob从azure密钥保险库服务中获取证书,并且在本地我没有问题从kv访问/检索此证书。但是,当部署此webjob时,出现此错误:

System.Security.Cryptography.CryptographicException: The system cannot find the file specified.

   at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
   at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
   at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
   at Microsoft.Ambassadors.Infrastructure.KeyVaultService.<GetCertificateAsync>d__7.MoveNext() in C:\Source\Repos\Xbox.Ambassadors\Microsoft.Ambassadors.Azure\Microsoft.Ambassadors.Infrastructure\KeyVaultService.cs:line 0

我已使用AAD注册了该应用程序(托管此Webjob的位置),并且该应用程序具有对kv空间的只读访问权限。我发现了一些与此相关的帖子(我认为..?):

"An internal error occurred." when loading pfx file with X509Certificate2

X509Certificate Constructor Exception

但是我不确定这是否是我可以做的事情...?如果有人可以提供帮助,那真是太好了!谢谢:D

2 个答案:

答案 0 :(得分:3)

除了要部署到Azure Web应用程序外,我遇到了同样的问题。我通过添加X509KeyStorageFlags来解决它。

SecretBundle secretBundle = await keyVaultClient.GetSecretAsync(_keyVaultOptions.IdentitySigningCredentialUri);
_signingCredential = new X509Certificate2(Convert.FromBase64String(secretBundle.Value), string.Empty, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

答案 1 :(得分:0)

我看到人们遇到的一个非常常见的问题与权限有关。确保代表您的Web作业的应用程序(服务主体)在密钥库访问策略中具有足够的权限,因为我看不到您在问题中提及任何有关访问策略的事情。

步骤-

  1. 转到您的关键保险库访问策略-enter image description here
  2. 添加新政策
  3. 选择您的校长(代表网络工作的应用)。至少授予密钥,机密和证书的权限
  4. 点击确定
  5. 完成策略刀片后,单击顶部的“保存”按钮。这是一个普通的步骤,它会被遗漏,并且策略永远也不会保存。

查看此SO post的多种方法。尽管该内容仅涉及机密,但是您在添加策略时在复选框中选择的权限将有所不同。

如果仍然无法解决问题,请发布更详细的代码以从Vault访问证书,并且如果您的异常堆栈跟踪超出了您已经共享的范围,则也应包括在内。