Я пытаюсь проверить, что сертификат из подписи цепочки обратно к определенному корневому сертификату, который не доверен 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
не-NULL снова приведет к системным хранилищам, но это не имеет никакого значения.
Я что-то упускаю или есть лучший способ сделать это?
Редактировать : просто чтобы дать немного больше контекста, я пытаюсь сделать что-то похожее на сертификаты подписи драйверов, где сертификат подписи цепочки обратно к двум различным корням: один стандартный корень CA, которому доверяют ОС и один внутренний корень (которому в драйверах также доверяет ОС, но в моем случае будет доверять только мое приложение). Крест происходит где-то посередине «главной» цепи; потенциально может быть несколько разных файлов, подписанных разными «настоящими» центрами сертификации, но при этом они будут связаны с моим внутренним сертификатом.