2012-08-22 33 views
0

我想創建一個CNG(的Windows加密API下一代)鑰匙手柄通過調用NCryptOpenKey()和使用證書的指紋作爲密鑰名稱參數:NCryptOpenKey()

LPCWSTR keyName = L"\0xe0\0xf5\0xdf\0x72\0x7f\0x81\0x92\0xfa\0xae\0x8a\0x4b\0xf1\0xd5\0x53\0xc1\0xbe\0x40\0x18\0x90\0xdc"; 
NCryptOpenKey(hProvider, &hKey, keyName, 0, 0); 

使用此鍵名鍵不能發現,但是當我在certmgr.msc中查找時,我可以看到帶有該指紋的證書(「e0 f5 df 72 7f 81 92 fa ae 8a 4b f1 d5 53 c1 be 40 18 90 dc」)。這裏可能是什麼問題?

編輯:我基本上想要做的事情(正如我在堆棧溢出人員的幫助下發現的那樣))是從存儲在Windows證書存儲中的證書創建NCRYPT_KEY_HANDLE。

+1

也許你應該使用ASCII十六進制表示,而不是二進制十六進制表示的。 –

+0

你的意思是這樣的:'LPCWSTR的keyName = L 「e0f5df727f8192faae8a4bf1d553c1be401890dc」;'?我剛剛嘗試過,仍然無法找到鑰匙。我想知道是否有人真的使用CNG API來做我們正在做的事情,那就是:用戶安裝一個證書(持有私鑰),並且程序試圖使用這個證書解密一些數據(從未見過或檢索私鑰)。我不認爲這是一種不尋常的方法 - 是嗎? – kitomer

+0

我終於通過使用函數'CryptAcquireCertificatePrivateKey()'使用參數'CRYPT_ACQUIRE_PREFER_NCRYPT_KEY_FLAG'解決與人民羣衆的幫助的問題。這使我可以獲得一個'NCRYPT_KEY_HANDLE',然後我可以使用它來加密/解密數據。看起來,如果安裝了附有私鑰的證書(在Windows 7中),則附加的私鑰將安裝在CNG密鑰存儲中。該解決方案還導致了CNG API不能用於查找某個證書的結論,只是所有已安裝的私鑰。 – kitomer

回答

1

的指紋和密鑰名通常沒有關係。

要獲取與證書關聯的密鑰的名稱,請使用CertGetCertificateContextPropertyCERT_KEY_PROV_INFO_PROP_ID

+0

這有點幫助!現在的問題是帶有'CERT_KEY_PROV_INFO_PROP_ID'的'CertGetCertificateContextProperty()'現在返回一個失敗代碼 - 意味着無法檢索到這個屬性。如果我檢索證書的友好名稱('CERT_FRIENDLY_NAME_PROP_ID'),我會得到預期的名稱(我在certmgr.msc中設置的名稱,它告訴我這是我正在查找的證書)。爲什麼'CERT_KEY_PROV_INFO_PROP_ID'屬性不可訪問? – kitomer

0

證書不包含私鑰。 CERT_CONTEXT可以有一個CERT_KEY_PROV_INFO_PROP_ID屬性,說明在哪裏可以找到相關的私鑰。它由系統函數CryptAcquireCertificatePrivateKey和其他高級加密函數使用。此屬性是有關CNG中私鑰位置的唯一信息。

此外,您還可以打開每一個循環存儲的密鑰和證書用的一個比較私人密鑰BLOB。

+0

然後,我如何以非編程方式從文件(其中有私鑰)中安裝證書,並讓該密鑰位於CNG密鑰存儲區中?我迄今爲止所做的所有嘗試都失敗了:我在「個人」證書文件夾中看到一個明顯擁有私鑰的證書,但在遍歷使用'NCryptEnumKeys()'存儲的密鑰時,我沒有看到該密鑰。這裏可能是什麼問題? – kitomer

+0

我知道在Windows 7和更高版本上沒有辦法通過內置實用程序來安裝證書和私鑰。即使標準* .pfx導入只提取證書。 –

+0

是否有任何非內建工具可以允許這樣做?程序化方式(使用NCrypt *函數)是否可能(作爲最後的手段)?提前致謝! – kitomer

0

如果您想嘗試一下我的例子,這裏是一個代碼:

DATA_BLOB key; 
FILE *fil = _wfopen(L"D:\\222.p8", L"rb"); 
if(fil) 
{ 
    fseek(fil, 0 ,2); 
    key.cbData = ftell(fil); 
    fseek(fil, 0, 0); 
    key.pbData = new BYTE[key.cbData]; 

    fread(key.pbData, 1, key.cbData, fil); 
    fclose(fil); 
} else { 
    MessageBox(L"Cannot open file", L"Error", MB_ICONERROR); 
    return; 
} 

BCryptBuffer nameBuf; 
nameBuf.BufferType = NCRYPTBUFFER_PKCS_KEY_NAME; 
nameBuf.pvBuffer = L"killme"; 
nameBuf.cbBuffer = 14; 

NCryptBufferDesc parList; 
parList.ulVersion = NCRYPTBUFFER_VERSION; 
parList.cBuffers = 1; 
parList.pBuffers = &nameBuf; 

// No error handlers!!! 
NCRYPT_PROV_HANDLE hProv; 
NCRYPT_KEY_HANDLE hKey; 
NCryptOpenStorageProvider(&hProv, L"Microsoft Software Key Storage Provider", 0); 
NCryptImportKey(hProv, NULL, NCRYPT_PKCS8_PRIVATE_KEY_BLOB, &parList, &hKey, key.pbData, key.cbData, 0); 
NCryptFreeObject(hKey); 
NCryptFreeObject(hProv); 
return; 

And this is my file (in HEX): 

30 82 02 78 02 01 00 30 0D 06 09 2A 86 48 86 F7 
0D 01 01 01 05 00 04 82 02 62 30 82 02 5E 02 01 
00 02 81 81 00 BB 13 C9 C6 4A 18 1F 11 1D D3 CB 
E4 6A E2 F4 46 8C 1D 67 7F F2 6E 16 67 C6 81 B9 
D9 93 56 45 0B D5 EA 0F EB 7F F3 1D 83 07 19 3B 
A7 1C 84 82 23 88 44 65 13 79 78 EA E0 B7 AD A8 
4D B6 3C 9B D4 74 48 51 0D E8 60 59 19 D8 28 2B 
49 FE BC 8D BF 62 0D 44 70 70 76 2D 83 5B 2E DE 
9E 97 40 D3 BE 23 36 BB 02 3B F0 17 F2 EA 9A 97 
28 41 39 7F A1 98 6E CB A3 9F 5B B3 81 D8 66 73 
D5 19 63 35 E9 02 03 01 00 01 02 81 80 02 BA 5C 
CF 35 C0 B8 F5 EB 45 18 61 B7 51 4C 95 EE C5 CA 
FE E9 A3 C3 53 36 13 7E DD F6 5B B9 5C 07 D2 DC 
47 E7 30 BE 0B 18 17 BD 1A 9D BC 2C ED A4 62 0D 
9B 45 6D 31 A2 49 EB 65 5B 3A 14 BE 2C F4 DC C8 
9B 94 2C 5A EF 1E 43 00 3E 88 00 D3 F1 0F 6A E3 
14 C1 4D C8 7E 77 BD C8 41 92 8B 7D 2A B5 36 1A 
61 81 9C 38 F1 34 C4 C3 73 57 67 25 4C 93 59 9B 
C7 1B 10 39 F2 B2 2F 85 ED 69 B4 43 01 02 41 00 
EC D9 DD B0 C8 F3 BC 39 77 9F 15 20 D5 80 C7 E3 
F5 36 DB F0 BF AC 27 9E 82 A1 CB 64 F0 26 5A 31 
97 C5 75 B0 CB 42 E3 0D AC F1 69 AF 02 1C 0F F5 
38 7A 75 5C 87 41 16 D7 57 E5 A5 78 BB A4 6E 89 
02 41 00 CA 33 BF CA 34 F6 17 F8 F8 1F 0C FF EE 
62 18 09 22 BD 45 DC 2E E7 5D 6C 0F 66 0E 21 3D 
74 61 35 79 19 56 91 1B 90 93 12 AD BA FA 31 23 
4D D2 AE F8 0F 00 46 DE 6B F4 31 62 E3 88 5F 80 
35 B4 61 02 41 00 C7 78 AC C6 28 57 6D 5C 10 AC 
7F C4 C9 4A CE 0D E4 04 B1 B2 CE 1A 14 BB E0 54 
96 D1 89 97 23 3A C5 11 5D 8E E9 80 89 6C 89 0C 
3F EF 4E 1D 88 2B 03 C7 CE 73 80 CD 86 89 11 D3 
AC 4A 43 ED B5 D1 02 41 00 A7 E7 E3 0A 31 82 6D 
93 B3 CE 6D 08 15 56 E5 A8 A8 6D 4D 96 B2 68 33 
9E A9 06 D1 12 EF 2A 36 12 A6 55 D1 19 BC 2F 08 
C2 08 FB EC 08 63 CD 9A F6 EA 4B E2 A9 F6 C6 E4 
47 22 5B D9 01 9C C0 7B E1 02 41 00 E1 94 F0 BB 
B8 7E E6 CF 38 E0 8D 6B F7 BB E2 47 A2 B6 E4 EB 
A5 C7 15 62 76 C4 BA B8 DC 81 06 24 EB B1 46 9B 
EE 5D AC A5 A6 EB 93 2E B4 E7 F8 A3 CD FB 40 C1 
C9 F9 27 DF 31 8B BB EE 29 4F 63 6D 
+0

謝謝,但我用另一種方式(見主題)。 – kitomer