我正在將一箇舊的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();
}
}
儘量不要使用CRYPT_MACHINE_KEYSET收購時,改用0.1 – fofik 2013-04-11 10:24:57
創建鏈接到相關的材料可能使他人有幫助,以及http://stackoverflow.com/questions/4826390/ beid-c-sharp-cryptoacquirefailed-error-80090019 – 2015-09-15 01:39:17