我有一个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
答案 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作业的应用程序(服务主体)在密钥库访问策略中具有足够的权限,因为我看不到您在问题中提及任何有关访问策略的事情。
步骤-
查看此SO post的多种方法。尽管该内容仅涉及机密,但是您在添加策略时在复选框中选择的权限将有所不同。
如果仍然无法解决问题,请发布更详细的代码以从Vault访问证书,并且如果您的异常堆栈跟踪超出了您已经共享的范围,则也应包括在内。