我正在尝试使用证书私钥解密一些数据。当证书安装在本地机器上时(我使用自签名证书进行测试,并且我有证书的私钥),一切都很好,但当我尝试使用相同的代码从远程机器访问私钥时,我会得到“密钥集不存在”异常。
我正在使用一个控制台应用程序进行测试,并确保我的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,但两者似乎都有相同的根本原因。