我試圖驗證從簽名證書鏈回到特定的根證書,這是而不是受Windows信任(它是應用程序的專用證書)。獲取證書鏈到私人根
我目前的嘗試做到這一點涉及創建一個鏈接引擎,它只信任我想要的特定證書作爲根目錄,以便不會生成其他鏈。
HCERTSTORE hPrivateRootStore = CertOpenStore(CERT_STORE_PROV_FILENAME, dwEncoding,
NULL, CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG,
_T("C:\\Test\\PrivateRoot.cer"));
CERT_CHAIN_ENGINE_CONFIG config;
memset(&config, 0, sizeof(config));
config.cbSize = sizeof(config);
config.hRestrictedTrust = hPrivateRootStore;
config.dwFlags = CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL | CERT_CHAIN_ENABLE_SHARE_STORE;
HCERTCHAINENGINE hEngine;
CertCreateCertificateChainEngine(&config, &hEngine);
CERT_CHAIN_PARA params;
memset(¶ms, 0, sizeof(params));
params.cbSize = sizeof(params);
PCCERT_CHAIN_CONTEXT chains = NULL;
if (CertGetCertificateChain(hEngine, pCertContext, NULL, hStore, ¶ms,
0, NULL, &chains))
...
(檢查省略錯誤清晰度;
pCertContext
和
hStore
從
CryptQueryObject
來提取簽署的二進制文件的簽名和相關證書。)
不幸的是,這似乎並沒有工作;儘管使用了自定義鏈接引擎,但它似乎仍在搜索操作系統存儲庫,並且沒有找到鏈或找到一個不同的根目錄(這是操作系統信任的)。我只能通過將我的私有根證書添加到操作系統信任的商店來獲得我想要的鏈。
我也嘗試將config.hRestrictedOther
設置爲空的內存存儲區,因爲文檔建議非空的hRestrictedTrust
會再次引入系統存儲區,但這沒有任何區別。
有什麼我失蹤,或更好的方式來做到這一點?
編輯:只是爲了給更多的情況下,我試圖做類似驅動程序簽名的證書,其中籤名證書鏈接回兩個不同的東西根:一個標準的CA根由OS信任,一個內部根目錄(在驅動程序中也受操作系統信任,但在我的情況下只會受到我的應用程序的信任)。交叉發生在「主」鏈中間的某個地方;可能會有許多不同的文件都與不同的「真實」CA簽署,但仍然鏈接到我的內部證書。
經過一番調查,我發現在Win7中'hExclusiveRoot'成員被添加到'CERT_CHAIN_ENGINE_CONFIG'。我認爲相關的描述清楚地表明'CertCreateCertificateChainEngine'不提供任何機制來忽略舊版本中的系統存儲(這讓我想知道它到底是什麼,但這是一個單獨的問題)。所以,新的問題:是否有其他方法來枚舉可能的鏈回到我想要的根?與'CertVerifyCertificateChainPolicy'兼容的東西會很好,儘管如果需要的話我可能沒有它。 – Miral
你試圖分析的證書文件格式是什麼? –
該主題是Authenticode簽名的二進制文件,所需的根目錄是一個編譯到應用程序中的.cer,並作爲「PCCERT_CONTEXT」加載。 – Miral