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

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

var cert = new X509Certificate2(fileData, password);

并存储诸如指纹之类的东西.我不需要将其实际存储在服务器上,只需确认它是有效的证书并存储一些信息即可.在本地,这很有效(显然,我可以更好地访问我的密钥存储区),但是当我将其放到天蓝色时,会收到错误消息:

System.Security.Cryptography.CryptographicException: Access denied.

有什么方法可以使此信息避开此方法或使用此方法而不会导致访问被拒绝?我对证书不是很好,因此,如果您需要更多信息,请告诉我.谢谢.

解决方法:

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

他们写在哪里?

>如果指定X509KeyStorageFlags.MachineKeySet:在计算机密钥库中,您需要是管理员.
>如果指定X509KeyStorageFlags.UserKeySet:在用户密钥库中,您的用户配置文件可能需要存在/加载.
>如果您都不指定:

>如果PFX本身已编码该密钥属于机器密钥集中,则机器密钥库(需要管理员).
>否则,用户密钥库(可能需要配置文件).

给定“访问被拒绝”,我猜您是在PFX本身指定了机器密钥库的情况下解决的,您可以将调用更改为

新的X509Certificate2(fileData,密码,X509KeyStorageFlags.UserKeySet)

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

有一个选项可以加载PFX,而无需将私钥写入磁盘,但是.NET Framework中不提供该选项(尽管最近已将其添加到.NET Core中).如果确实需要它,则可以使用PKCS12_NO_PERSIST_KEY标志研究p /调用PFXImportCertStore,然后将所得HCERTSTORE值传递给X509Store.ctor(IntPtr),并通过X509Store.Certificates属性读取证书.但是请注意,大多数.NET Framework不会理解这些证书对象具有关联的私钥,因此它们很可能仅充当仅公共证书对象.

上一篇:记录一下Java访问https服务出现的异常情况


下一篇:c#-无法使用X509客户端证书连接到HTTPS