现在我正在上传.pfx文件,输入密码并致电
var cert = new X509Certificate2(fileData, password);
并存储指纹等内容。我不需要将其实际存储在服务器上,只需验证它是否是有效的证书并存储一些信息。在本地这个工作(显然我可以更好地访问我的密钥库)但是当我把它放在天蓝色时我得到错误:
System.Security.Cryptography.CryptographicException:拒绝访问。
有没有办法让这些信息回避这个或使用这种方法而不会拒绝访问?我对证书不是很了解,所以如果您需要更多信息请告诉我。谢谢。
答案 0 :(得分:3)
在Windows上打开PFX时,任何私钥都会写入磁盘。它们将在以后删除(除非你指定PersistKeySet),但它们仍然必须写(ish)。
他们在哪里写的?
X509KeyStorageFlags.MachineKeySet
:在计算机密钥库中,您需要是管理员。X509KeyStorageFlags.UserKeySet
:在用户密钥库中,您的用户配置文件可能需要存在/加载。鉴于"访问被拒绝"我猜你是在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都不了解这些证书对象具有关联的私钥,因此它们可能只会作为公共证书对象运行。