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

时间:2016-11-10 20:39:33

标签: c# asp.net azure x509certificate x509certificate2

现在我正在上传.pfx文件,输入密码并致电

var cert = new X509Certificate2(fileData, password);

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

  

System.Security.Cryptography.CryptographicException:拒绝访问。

有没有办法让这些信息回避这个或使用这种方法而不会拒绝访问?我对证书不是很了解,所以如果您需要更多信息请告诉我。谢谢。

1 个答案:

答案 0 :(得分:3)

在Windows上打开PFX时,任何私钥都会写入磁盘。它们将在以后删除(除非你指定PersistKeySet),但它们仍然必须写(ish)。

他们在哪里写的?

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

鉴于"访问被拒绝"我猜你是在PFX本身指定了机器密钥库的情况下解决了这个问题,你将你的呼叫改为

new X509Certificate2(fileData, password, X509KeyStorageFlags.UserKeySet)

一切都应该有效。如果指定UserKeySet但仍然出现错误,那可能是配置文件加载问题。

选项,可以在不将私钥写入磁盘的情况下加载PFX,但它在.NET Framework中不可用(尽管最近已添加到.NET Core中)。如果你真的需要它,你可以查看p /用PKCS12_NO_PERSIST_KEY标志调用PFXImportCertStore,然后将结果HCERTSTORE值传递给X509Store.ctor(IntPtr)并通过{{1}读取你的证书属性。但请注意,大多数.NET Framework都不了解这些证书对象具有关联的私钥,因此它们可能只会作为公共证书对象运行。