署名チェーンからの証明書が、 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
署名と関連する証明書を抽出することによってエラー チェックが行われます。)
残念ながら、これはうまくいかないようです。カスタムチェーンエンジンを使用しているにもかかわらず、OSストアを検索しているようで、チェーンが見つからないか、別のルート(OSによって信頼されている)へのチェーンが見つかります。OS の信頼できるストアにプライベート ルート証明書を追加することによってのみ、必要なチェーンを取得できます。
config.hRestrictedOther
ドキュメントでは、非 NULL を使用するとシステム ストアが再度読み込まれることが示唆されているため、空のメモリ ストアに設定しようとしましhRestrictedTrust
たが、違いはありません。
私が見逃しているもの、またはこれを行うためのより良い方法はありますか?
編集:もう少しコンテキストを提供するために、署名証明書が2つの異なるルートにチェーンバックするドライバー署名証明書に似た何かをしようとしています:OSによって信頼される1つの標準CAルートと1つの内部ルート(これはドライバーも OS によって信頼されますが、私の場合はアプリによってのみ信頼されます)。クロスは、「メイン」チェーンの途中で発生します。すべてが異なる「実際の」CAで署名されているが、内部証明書に連鎖している多数の異なるファイルが潜在的に存在する可能性があります。