証明書ストアの状態の管理
いくつかの関数が、証明書ストアの状態を管理するためのサービスを提供しています。
証明書にアクセスするには、証明書が格納されている証明書ストアを、CertOpenStore または CertOpenSystemStore を呼び出して開く必要があります。
通常、証明書ストアはキャッシュされたメモリで開かれます。 新しいストアを使用するも、その内容をローカル レジストリ、リモート コンピューター上のレジストリ、ディスク ファイル、PKCS #7 メッセージ、またはその他のソースから読み込むこともできます。
CryptoAPI 証明書ストア関数を使用すると、ストアは、キャッシュ メモリ外の証明書 (たとえば、Microsoft Certificate Server Database によって提供される証明書など) を、外部データベースに保持することもできます。
CertOpenStore 関数のパラメーターの 1 つである lpszStoreProvider は、開いているストアの種類と、そのストアを開くために使用されるプロバイダーを特定します。 さまざまなプロバイダーを使用して証明書ストアを開く例については、「証明書ストアを開く C コードの例」を参照してください。
CertCloseStore は証明書ストアを閉じます。 証明書ストアが閉じられると、そのストア内の各証明書コンテキストの参照カウントが 1 つ減ります。 参照カウントが 0 になる証明書のメモリが解放されます。
CertCloseStore で CERT_CLOSE_STORE_FORCE_FLAG を設定すると、証明書ストアが閉じられ、参照カウントに関係なく、すべての証明書コンテキストのメモリが解放されます。 マルチスレッド プログラムなど、一部のケースでは、これは望ましくない場合があります。 CERT_CLOSE_STORE_CHECK_FLAG が設定されている場合、ストアは閉じられますが、参照カウントが 0 に減っていない証明書にメモリがまだ割り当てられている場合は、関数によって警告値が返されます。 証明書の参照カウントが 0 より大きい場合、その証明書コンテキストの複製は解放されていません。 開いたままの証明書を解放するには、CertFreeCertificateContext、CertFreeCRLContext、および CertFreeCTLContext を使用します。
Note
証明書コンテキストは、他のメンバーの中でも、エンコードされた証明書 BLOB へのポインターと、CERT_INFO 構造体へのポインターを持つ CERT_CONTEXT 型の構造体です。 CERT_INFO 構造には、最も重要な証明書データが含まれています。 証明書、証明書失効リスト (CRL)、および証明書信頼リスト (CTL) コンテキスト構造の詳細については、「証明書コンテキストのエンコードとデコード」を参照してください。
各証明書コンテキストには、割り当てられているコンテキストのアドレスのコピーの数を示す参照カウントも含まれています。 証明書コンテキストが何らかの方法で複製されるたびに、その参照カウントは 1 ずつ増加します。 証明書コンテキストへのポインターが解放されるたびに、証明書コンテキスト内の参照カウントが 1 ずつ減少します。 証明書コンテキストの参照カウントが 0 に達すると、コンテキストを保持しているメモリは割り当て解除されます。 また、証明書コンテキストに割り当てられたメモリは、そのコンテキストがストア内にあり、そのストアが CERT_CLOSE_STORE_FORCE_FLAG を使用して閉じられると、割り当て解除されます。 コンテキストのメモリが割り当て解除され、そのコンテキストへのポインターがまだ使用されている場合、それらのポインターは無効になります。
CertDuplicateStore は、ストアの参照カウントを増やします。
CertSaveStore は、ストアの内容をディスク ファイルまたはメモリの場所に保存します。
CertControlStore は、開いている間にストアを管理します。 開いているストアを持つアプリケーションは、そのストアの永続化された状態が他のプロセスによって変更されたときに通知することができます。 これは、新しい証明書が、ドメイン コントロール コンピューターからローカル コンピューター ストアにコピーされた場合に発生する可能性があります。
変更が検出されると、キャッシュされたストアは、ストアの永続化された状態と一致するように、キャッシュされたストアを再同期することができます。 CertControlStore では、キャッシュされたストアの変更が自動的に保存されない場合に、キャッシュされたストアの変更を永続的ストレージにコピーするプロセスもサポートされています。
証明書ストアに似た証明書コンテキストには、拡張プロパティを含めることができます。 CertSetStoreProperty は、拡張プロパティを証明書ストアに追加します。 CertGetStoreProperty は、証明書ストアに設定されたすべてのプロパティを取得します。 現時点では、定義済みの証明書ストア プロパティはストアのローカライズされた名前のみです。