2017-04-17 40 views
0

我有一個小應用程序作爲「證書管理器」,用於更大的程序,這樣用戶就不必手動安裝和配置證書。私鑰許可破壞程序退出

這非常簡單 - 它具有一些證書作爲嵌入資源,將其加載到適當的存儲中,然後設置適當配置的權限。

這似乎在程序運行時正常工作。使用MMC,我可以看到證書已安裝。如果我管理私鑰,它會正確添加新權限。但是,一旦關閉證書管理器,權限就會中斷。證書仍然安裝,但點擊Manage Private Keys彈出類似「密鑰不存在」的錯誤。

此外,如果該程序第二次運行,程序退出後權限將「正確」粘貼。

下面是程序用來驗證是否添加權限的代碼。這種方法每次都返回'true',即使權限之後會中斷。

private bool GetSecurityStatus(X509Certificate2 cert, X509Store store) 
    { 
     store.Open(OpenFlags.ReadOnly); 

     //add Authenticated Users to private cert 
     RSACryptoServiceProvider privKeyRSA = cert.PrivateKey as RSACryptoServiceProvider; 
     string keyFilePath = FindKeyLocation(privKeyRSA.CspKeyContainerInfo.UniqueKeyContainerName); 
     FileInfo privateKeyFileInfo = new FileInfo(keyFilePath + "\\" + privKeyRSA.CspKeyContainerInfo.UniqueKeyContainerName); 
     FileSecurity privateKeyFileSecurity = privateKeyFileInfo.GetAccessControl(); 

     AuthorizationRuleCollection rules = privateKeyFileSecurity.GetAccessRules(true, true, typeof(NTAccount)); 
     foreach (FileSystemAccessRule fsar in rules) 
     { 
      if(fsar.IdentityReference.Value.Contains("Authenticated Users") && fsar.AccessControlType == AccessControlType.Allow && fsar.FileSystemRights == FileSystemRights.FullControl){ 
       store.Close();return true; 
      } 
     } 
     //Close Private Cert store 
     store.Close(); 
     return false; 
    } 

FindKeyLocation返回私鑰的appdata \ Microsoft \ Crypto \ RSA \路徑。

我在想它必須做些什麼來改變私鑰文件本身的程序退出,但我不確定它爲什麼會第二次工作。

+0

您似乎根本沒有使用存儲(除了打開和關閉它),這意味着您正在檢查與「cert」關聯的私鑰的權限,但不一定是「cert」的表示在證書商店。 – bartonjs

+0

@bartonjs給定的代碼只是爲了證明權限本身已被發現。 – Skyl3lazer

+1

是的,但是如果兩個不同的證書實例獨立於PFX加載,那麼它們會使用哪些私鑰不同意。因此,如果您的檢測代碼被更改爲閱讀商店非常權限,您可能會發現下面有一個不同的問題。 – bartonjs

回答