从远程机器读取私钥时出现“System.Security.Cryptography.CryptographicException:Keyset不存在”

时间:2016-01-21 07:14:10

标签: c# ssl-certificate x509certificate private-key cryptoapi

我正在尝试使用证书私钥解密一些数据。在本地计算机上安装证书时,一切正常(我使用自签名证书进行测试,我有证书的私钥)但是当我尝试使用相同的代码从远程计算机访问私钥时,我得到“Keyset不存在”的例外。

我正在使用控制台应用程序进行测试,并确保我的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)

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

1 个答案:

答案 0 :(得分:0)

我们联系了Microsoft对解决方案的支持,以下是我们得到的回复:

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

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

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