Azure Web 应用程序新的 X509Certificate2() 导致 System.Security.Cryptography.CryptographicException:访问被拒绝

Azure Web Application new X509Certificate2() causing System.Security.Cryptography.CryptographicException: Access denied

现在我正在上传一个 .pfx 文件,输入密码并调用

var cert = new X509Certificate2(fileData, password);

并存储指纹等内容。我不需要将其实际存储在服务器上,只需验证它是一个有效的证书并存储一些信息即可。在本地这有效(显然我可以更好地访问我的密钥库)但是当我把它放在天蓝色时我得到错误:

System.Security.Cryptography.CryptographicException: Access denied.

是否有任何方法可以绕过此问题或使用此方法而不被拒绝访问来获取此信息?我不太擅长证书,所以如果您需要更多信息,请告诉我。谢谢。

在 Windows 上打开 PFX 时,所有私钥都会写入磁盘。它们稍后会被删除(除非您指定 PersistKeySet),但它们仍然必须写入(ish)。

它们写在哪里?

  • 如果指定X509KeyStorageFlags.MachineKeySet:在机器密钥库中,您需要是管理员。
  • 如果您指定 X509KeyStorageFlags.UserKeySet:在用户密钥库中,您的用户配置文件可能需要 exist/load。
  • 如果您不指定:
    • 如果 PFX 本身 已编码该密钥属于机器密钥集中,则机器密钥库(需要管理员)。
    • 否则用户密钥库(可能需要配置文件)。

考虑到 "Access Denied" 我猜您遇到了 PFX 本身指定机器密钥库的情况,要解决此问题,您需要将调用更改为

new X509Certificate2(fileData, password, X509KeyStorageFlags.UserKeySet)

一切正常。如果您指定了 UserKeySet 但仍然出现错误,则可能是配置文件加载问题。

有一个选项可以在不将私钥写入磁盘的情况下加载 PFX,但它在 .NET Framework 中不可用(尽管它最近被添加到 .NET Core 中) .如果你真的需要它,你可以查看 p/invoking PFXImportCertStore with the PKCS12_NO_PERSIST_KEY flag, then pass the resultant HCERTSTORE value to X509Store.ctor(IntPtr) 并通过 X509Store.Certificates 属性 阅读你的证书。但请注意,大多数 .NET Framework 不会理解这些证书对象具有关联的私钥,因此它们可能仅表现为 public-only 证书对象。