Rya*_*n Z 4 c# azure x509certificate azure-web-app-service
当我使用以下代码从文件系统访问证书时,无论是在本地还是在 azure 网站上,都没有问题:
X509Certificate2 certificate = new X509Certificate2(keyFilePath, "mysecret", X509KeyStorageFlags.MachineKeySet |
X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.Exportable);
Run Code Online (Sandbox Code Playgroud)
但是,当我按照https://azure.microsoft.com/en-us/blog/using-certificates-in-azure-websites-applications/ 上的说明使用 azure 证书存储时,前 3 个到9 个请求,所有后续调用都在以下行失败
var rsa = certificate.PrivateKey as RSACryptoServiceProvider;
Run Code Online (Sandbox Code Playgroud)
出现错误“System.Security.Cryptography.CryptographicException: Keyset does not exist”,直到站点重新启动,然后至少可以处理 3 个请求。
我很困惑为什么它对至少 3 个和最多 9 个请求有效,然后总是因错误而失败。我将不胜感激任何建议。
从 PFX 加载时,您指定了 PersistKeySet,通常只有在您计划将证书持久保存到证书存储时才应设置。尽管代码的某些方面可能会尝试变得聪明并自行清理私钥,方法是将 RSACryptoServiceProvider 对象标记PersistKeyInCsp
为false
.
我指出这一点的原因是“密钥集不存在”错误几乎总是意味着“证书存储被告知存在私钥,但有人在没有通知证书存储的情况下删除了它”。最有可能的罪魁祸首是某处设置PersistKeyInCsp
为false
(这意味着“在处置/完成时删除密钥文件”)。
如果您将 PersistKeyInCsp 设置为 false 但不手动处理对象,则由于终结器,您将获得延迟清理,这将解释为什么它是 3-9 成功而不是确定性数字。
(我也不得不指出你应该使用cert.GetRSAPrivateKey()
而不是cert.PrivateKey
,因为a)它是类型安全的并且b)它是调用者拥有的生命周期(你应该处理它)而不是共享/模糊的生命周期。它使事情变得更加可预测,尽管它几乎从不返回 RSACryptoServiceProvider,因此您不应该尝试对其进行强制转换)
归档时间: |
|
查看次数: |
8134 次 |
最近记录: |