2013-04-11 54 views
2

我正在將一箇舊的VB6應用程序移植到.NET中,並且自從昨天下午發生一些CryptoAPI調用後,我遇到了問題。CryptoAPI AcquireContext無法檢索密鑰容器

特別是我無法檢索已定義的密鑰容器。我使用CryptAcquireContext()函數。我在創建容器的地方使用了一些測試代碼。然後如果我去C:\Users...\Roaming\Microsoft\Crypto\RSA\Machine Keys\我可以看到一個使用我定義的容器名稱創建的文件,所以我假設它已成功創建。

隨後調用嘗試創建相同的容器驗證該假設,因爲我得到的keyset已被定義的win32錯誤。

無論如何,在我嘗試檢索我已經創建的容器的下一個代碼調用中,我得到了未定義鍵集的Windows錯誤。

錯誤:-2146893799(80090019)鍵集未定義。

任何想法?

下面是一個代碼示例:

public const uint PROV_RSA_FULL = 1; 
public const uint CRYPT_NEWKEYSET = 0x00000008; 
public const uint CRYPT_MACHINE_KEYSET = 0x00000020; 
const string MS_DEF_PROV = "Microsoft Base Cryptographic Provider v1.0"; 

[DllImport("advapi32.dll", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool CryptAcquireContext(out IntPtr phProv, string pszContainer, string pszProvider, uint dwProvType, uint dwFlags); 

public static void CreateContainer() 
{ 
     IntPtr hCryptProv; 
     int error; 
     if (!CryptAcquireContext(out hCryptProv, "new", MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)) 
     { 
      error = Marshal.GetLastWin32Error(); 
     } 

     if (!CryptAcquireContext(out hCryptProv, "new", MS_DEF_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)) 
     { 
      error = Marshal.GetLastWin32Error(); 
     } 
} 
+0

儘量不要使用CRYPT_MACHINE_KEYSET收購時,改用0.1 – fofik 2013-04-11 10:24:57

+0

創建鏈接到相關的材料可能使他人有幫助,以及http://stackoverflow.com/questions/4826390/ beid-c-sharp-cryptoacquirefailed-error-80090019 – 2015-09-15 01:39:17

回答

5

你正在創建該用戶的密鑰容器,而是試圖從基於機器的存儲得到它。要解決此問題,您需要將CRYPT_MACHINE_KEYSET更改爲0,或者根據需要使用CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET創建密鑰集時。

默認情況下,密鑰和密鑰容器存儲爲用戶密鑰。對於基本提供商,這意味着用戶密鑰容器存儲在用戶的配置文件中。只有創建密鑰容器的用戶和具有管理權限的用戶才能訪問由管理員創建而沒有此標誌的密鑰容器。

有關詳細信息,請查看下面的鏈接。

CryptAcquireContext() use and troubleshooting

CryptAcquireContext function

+0

非常感謝你的工作。雖然我不太瞭解這個概念:( – muku 2013-04-11 11:23:51