代码之家  ›  专栏  ›  技术社区  ›  Nimesh Madhavan

系统安全加密。CryptographicException:从远程计算机读取私钥时密钥集不存在

  •  0
  • Nimesh Madhavan  · 技术社区  · 10 年前

    我正在尝试使用证书私钥解密一些数据。当证书安装在本地机器上时(我使用自签名证书进行测试,并且我有证书的私钥),一切都很好,但当我尝试使用相同的代码从远程机器访问私钥时,我会得到“密钥集不存在”异常。

    我正在使用一个控制台应用程序进行测试,并确保我的id对远程服务器上的私钥具有读取权限。下面是我使用的示例代码:

    var store = new X509Store(@"\\server1\My", StoreLocation.LocalMachine);
    store.Open(OpenFlags.ReadOnly);
    var result = store.Certificates.Find(X509FindType.FindBySubjectName, "server1.test.com", false);
    var certificate = result[0];
    store.Close();
    
    //This succeeds from both local and remote server
    var rsaPublic = (RSACryptoServiceProvider)certificate.PublicKey.Key;
    
    //This succeeds from local, but fails from remote server
    var rsaPrivate = (RSACryptoServiceProvider)certificate.PrivateKey;
    

    下面是异常调用堆栈

    Unhandled Exception: System.Security.Cryptography.CryptographicException: Keyset does not exist
    
       at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
       at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
       at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
       at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
       at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
       at RsaPoc.Program.Main(String[] args)
    

    我找到了一个 similar 关于SO的未回答问题,但它使用的是非托管代码,而我使用的是托管API,但两者似乎都有相同的根本原因。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Nimesh Madhavan    10 年前

    我们联系了Microsoft支持部门寻求解决方案,下面是我们得到的答复:

    1. 为什么在服务器2上执行代码时私钥不可用?
      A: 这实际上是设计的。证书存储不同于私钥存储。虽然您可以远程枚举证书,但无法远程访问私钥。

    2. 是否可以通过授予用户额外权限或更改组策略设置来解决此问题? A: 不。这不涉及对文件的特权或权限。

    3. 如果不是以上两种情况,你能建议合适的解决方案吗?
      A: 1.您可以在所有计算机上安装证书,以便每个计算机都有私钥的副本。
      2.您可以创建漫游域用户。漫游证书是唯一可以在机器之间漫游私钥的情况。 漫游配置文件位于服务器上,当用户登录时,将创建配置文件的临时副本(包括私钥)。
      3.使用第三方加密提供程序。有些加密提供程序确实允许远程私钥访问和加密操作。