2016-01-21 175 views
0

我試圖使用證書私鑰解密一些數據。當證書安裝在本地計算機上時(我正在使用自簽名證書進行測試並且擁有證書的私鑰),這一切都可以正常工作,但是當我嘗試從使用相同代碼的遠程計算機訪問私鑰時,我得到「鍵盤不存在」異常。當從遠程機器讀取私鑰時「System.Security.Cryptography.CryptographicException:密鑰集不存在」

我正在使用控制檯應用程序進行測試,並且確保我的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,但兩者似乎都有相同的根本原因。

回答

0

我們聯繫微軟支持的解決方案,下面是我們得到的迴應:

  1. 爲什麼在Server2上執行代碼的私有密鑰不可用?
    答:這實際上是通過設計。證書存儲區與私人密鑰存儲區不同。雖然您可以遠程枚舉證書,但無法遠程訪問私鑰。

  2. 此問題可以通過給予用戶額外的權限或通過組策略設置中的更改來修復嗎? A:不。這不涉及文件的權限或權限。

  3. 如果不是上述兩者,那麼您能否提出合適的解決方案?答:您可以在所有機器上安裝證書,這樣每個機器都有一個私鑰副本。
    2.您可以創建漫遊域用戶。漫遊證書是私鑰可以在機器之間漫遊的唯一情況。 漫遊配置文件位於服務器上,當用戶登錄時,創建配置文件的臨時副本(包括私鑰)。
    3.使用第三方加密提供程序。有一些加密提供程序允許遠程私鑰訪問和加密操作。

相關問題