我将X509Certificate存储在数据库(in byte[]
)中,以便我的应用程序可以检索证书并使用它来签署我的JWT.
我的x509Certificate是从我在我的机器上生成的.pfx文件传递出来的,但现在它作为字节串存在于数据库中.
我运行它时,我的应用程序在本地工作得很好.应用程序可以正确创建该X509Certificate2的实例并将其用于我的要求,但是当我尝试在我的azurewebsites Web应用程序中使用它时会出现问题.
基本上我无法访问证书的PrivateKey实例变量,我得到一个例外
System.Security.Cryptography.CryptographicException: Keyset does not exist
我正在用这个重新实例化证书
var cert = new X509Certificate2(myCertInBytes, myCertPass, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
我正在使用ASPNET 5 rc1-update1.我也试过在另一台机器上运行它,它工作正常,只有在我发布到Azure时才会出现这个问题.并且还要添加其他内容,当我运行使用DNX版本beta7运行的相同项目时,此应用程序正在运行
任何帮助赞赏.
问题是Azure Web Apps限制对计算机私钥存储的访问,因为它是一个共享的托管环境,并且您没有完全拥有该计算机.作为解决方法,您可以加载证书.此博客文章介绍了如何执行此操作的最佳做法:https: //azure.microsoft.com/en-us/blog/using-certificates-in-azure-websites-applications/
请注意,这仅适用于Basic Tier及以上(非免费或共享层).
这也可以从.cer文件中完成,如下所示,但是应该注意,这不是最佳实践,因为您以不安全的格式存储了代码的安全凭证.
public X509Certificate2 CertificateFromStrings(String certificateString64, String privateKeyXml) { try { var rsaCryptoServiceProvider = new RSACryptoServiceProvider(); rsaCryptoServiceProvider.FromXmlString(privateKeyXml); var certificateBytes = Convert.FromBase64String(certificateString64); var x509Certificate2 = new X509Certificate2(certificateBytes); x509Certificate2.PrivateKey = rsaCryptoServiceProvider; return x509Certificate2; } catch { return null; } }