我有一個小應用程序作爲「證書管理器」,用於更大的程序,這樣用戶就不必手動安裝和配置證書。私鑰許可破壞程序退出
這非常簡單 - 它具有一些證書作爲嵌入資源,將其加載到適當的存儲中,然後設置適當配置的權限。
這似乎在程序運行時正常工作。使用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 \路徑。
我在想它必須做些什麼來改變私鑰文件本身的程序退出,但我不確定它爲什麼會第二次工作。
您似乎根本沒有使用存儲(除了打開和關閉它),這意味着您正在檢查與「cert」關聯的私鑰的權限,但不一定是「cert」的表示在證書商店。 – bartonjs
@bartonjs給定的代碼只是爲了證明權限本身已被發現。 – Skyl3lazer
是的,但是如果兩個不同的證書實例獨立於PFX加載,那麼它們會使用哪些私鑰不同意。因此,如果您的檢測代碼被更改爲閱讀商店非常權限,您可能會發現下面有一個不同的問題。 – bartonjs