加密异常:拒绝访问 - 如何在用户存储上授权访问?

5
我正在尝试在WPF应用程序中从pfx文件加载证书,但它给我一个拒绝访问的错误。
using (FileStream stream = System.IO.File.OpenRead(certificatePath))
{
    using (BinaryReader reader = new BinaryReader(stream))
    {
        buffer = reader.ReadBytes((int)stream.Length);
    }
}

X509Certificate2 certificate = new X509Certificate2(buffer, password);

System.Security.Cryptography.CryptographicException:拒绝访问。
在System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) 中 在System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx) 中 在System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags) 中 在System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password) 中 在HelloWorld.HelloClient.Models.Infrastructure.ReadCertificateFromPfxFile(String certificatePath, String password)中,最后一行引起了异常。如果以管理员身份运行,则能正常工作。问题似乎是X509Certificate2的默认构造函数试图将密钥存储在用户存储区域中。我没有使用Web应用程序。此post未解决我的问题。这篇帖子无法解决我的问题。我想当前用户可能没有访问自己私有密钥存储区域的权限。但我如何赋予该访问权限?

可能是X509Certificate构造函数异常的重复问题。 - MethodMan
@MethodMan 这是关于 Web 应用程序和 IIS 中的修复。我有一个 WPF 应用程序,如何给用户存储授权? - Shiju Samuel
5个回答

10
如果有人正在寻找类似问题的解决方案,我希望您能发布一个修复方法。我运行了sysinternal process monitor,发现构造函数调用会在机器密钥文件夹中创建一个密钥,并授予用户对机器密钥进行写入的访问权限。

1
这也是我的问题。感谢您提供的解决方案! - Carsten Flokstra
3
你能再解释一下吗?我还不太明白你是怎么解决这个问题的。 - Shahryar Saljoughi

10
在我的情况下,这是由于缺少对 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 文件夹的 写入 权限所致。我的用户只有读取权限,一旦我授予写入权限,问题就解决了。

4

尝试加载X509Certificate2时出现相同的CryptographicException: Access denied错误,解决方法是授予对*MachineKeys*目录的读/写权限。

  1. 使用管理员权限打开CMD或Powershell。
  2. 执行以下命令以授权所有人读/写权限:icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /inheritance:r /grant Administrators:F /grant:r Everyone:RW

有关此目录的权限的更多信息:https://learn.microsoft.com/en-us/troubleshoot/windows-server/windows-security/default-permissions-machinekeys-folders


注意:这些组/用户名称是特定于当前文化设置的,请使用icacls C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys /inheritance:r /grant Administratoren:F /grant:r Jeder:RW来针对德语语言进行操作。 - Sven Mawby

1

如果有帮助的话,"CryptographicException: Access denied" 可能是由于磁盘空间不足引起的,这就是我的情况。


-1

我发现使用p12证书更容易,因为它不使用密钥库。 我使用Firefox将 pfx转换为p12。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接