CertOpenStore 関数 (wincrypt.h)
CertOpenStore 関数は、指定したストア プロバイダーの種類を使用して証明書ストアを開きます。 この関数はほとんどの目的で証明書ストアを開くことができますが、最も一般的な証明書ストアを開くには CertOpenSystemStore をお勧めします。 CertOpenStore は、より複雑なオプションや特殊なケースに必要です。
構文
HCERTSTORE CertOpenStore(
[in] LPCSTR lpszStoreProvider,
[in] DWORD dwEncodingType,
[in] HCRYPTPROV_LEGACY hCryptProv,
[in] DWORD dwFlags,
[in] const void *pvPara
);
パラメーター
[in] lpszStoreProvider
ストア プロバイダーの種類を含む null で終わる ANSI 文字列へのポインター。
次の値は、定義済みのストアの種類を表します。 ストア プロバイダーの種類によって、 pvPara パラメーターの内容と、 dwFlags パラメーターの高い単語の使用と意味が決まります。 追加のストア プロバイダーは、 CryptInstallOIDFunctionAddress または CryptRegisterOIDFunction 関数を使用してインストールまたは登録できます。 ストア プロバイダーの追加の詳細については、「 CertOpenStore 機能の拡張」を参照してください。
値 | 意味 |
---|---|
|
他のストアのコレクションとなるストアを開きます。 ストアは、 CertAddStoreToCollection と CertRemoveStoreFromCollection を使用してコレクションに追加または削除 されます。 ストアがコレクションに追加されると、そのストア内のすべての証明書、CRL、および CCTL がコレクション ストアの検索または列挙に使用できるようになります。
dwFlags の上位ワードは 0 に設定されます。 pvPara 値: pvPara パラメーターは NULL である必要があります。 |
|
指定した開いているファイルから読み取られた証明書、CRL、および CCTL を使用してストアを初期化します。 このプロバイダーは、PKCS #7 署名付きメッセージまたは単一のエンコードされた証明書ではなく、シリアル化されたストアのみを含むファイルを想定しています。
ファイル ポインターは、シリアル化されたストア情報の先頭に配置する必要があります。 シリアル化されたストア内のデータが証明書ストアに読み込まれた後、ファイル ポインターは、ファイル内のシリアル化されたストア データに従うことができるすべてのデータの先頭に配置されます。 dwFlags でCERT_FILE_STORE_COMMIT_ENABLEが設定されている場合、ファイル ハンドルは複製され、ストアは常にシリアル化されたストアとしてコミットされます。 ストアを閉じると、ファイルは閉じられません。 pvPara 値: pvPara パラメーターには、CreateFile を使用して開かれたファイルのハンドルへのポインターを含める必要があります。 |
|
ファイルから証明書、CRL、および CCTL を使用してストアを初期化します。 プロバイダーはファイルを開き、最初にシリアル化されたストアとしてファイルを読み取り、次に PKCS #7 署名付きメッセージとして読み取り、最後に 1 つのエンコードされた証明書として読み取ろうとします。
dwEncodingType パラメーターには、メッセージと証明書の両方で使用するエンコードの種類を含める必要があります。 ファイルに X.509 でエンコードされた証明書が含まれている場合、開いている操作は失敗し、 GetLastError 関数の呼び出しは ERROR_ACCESS_DENIEDを返します。 CERT_FILE_STORE_COMMIT_ENABLE フラグが dwFlags で設定されている場合、CreateFile に渡される dwCreationDisposition 値は次のようになります。
dwFlags にCERT_FILE_STORE_COMMIT_ENABLEが含まれている場合、ファイルは、開かれたファイルの種類に応じて PKCS #7 またはシリアル化されたストアとしてコミットされます。 ファイルが空の場合、またはファイル名に拡張子が .p7c または .spc である場合、ファイルは PKCS #7 としてコミットされます。 それ以外の場合、ファイルはシリアル化されたストアとしてコミットされます。 pvPara 値: pvPara パラメーターには、開かれていない既存のファイルの名前を含む null で終わる ANSI 文字列へのポインターが含まれている必要があります。 |
|
CERT_STORE_PROV_FILENAME_Aと同じです。
pvPara 値: pvPara パラメーターには、開かれていない既存のファイルの名前を含む null で終わる Unicode 文字列へのポインターが含まれている必要があります。 |
|
LDAP クエリの結果から証明書、CRL、および CCTL を使用してストアを初期化します。
ストアに対して書き込み操作を実行するには、クエリ文字列で、フィルターのない BASE クエリと 1 つの属性を指定する必要があります。 pvPara 値: dwFlags パラメーターにCERT_LDAP_STORE_OPENED_FLAGが含まれている場合は、pvPara を、使用する確立された LDAP セッションを指定するCERT_LDAP_STORE_OPENED_PARA構造体のアドレスに設定します。 それ以外の場合は、LDAP クエリ文字列を含む null で終わる Unicode 文字列を指す pvPara を設定します。 LDAP クエリ文字列の詳細については、「 LDAP 言語」を参照してください。 |
|
キャッシュされたメモリに証明書ストアを作成します。 証明書、 証明書失効リスト (CRL)、または 証明書信頼リスト (CCTL) は、最初はストアに読み込まれません。 通常、一時ストアを作成するために使用されます。
証明書、CRL、または CCTL の追加、またはメモリ ストア内の証明書、CRL、または CCTL のプロパティの変更は、自動的には保存されません。 CertSaveStore を使用して、ファイルまたはメモリ BLOB に保存できます。 pvPara 値: pvPara パラメーターは使用されません。 |
|
指定した暗号化メッセージの証明書、CRL、および CCTL を使用してストアを初期化します。 dwEncodingType パラメーターには、メッセージと証明書の両方で使用されるエンコードの種類を含める必要があります。
pvPara 値: pvPara パラメーターには、CryptMsgOpenToDecode の呼び出しによって返される、エンコードされたメッセージの HCRYPTMSG ハンドルが含まれています。 |
|
論理システム ストアのメンバーである指定された物理ストアの証明書、CRL、および CCTL を使用してストアを初期化します。
2 つの名前は、"Root.Default" などの円記号 (\) で区切ります。 ここで、"Root" はシステム ストアと " の名前です。Default" は物理ストアの名前です。 システム名と物理ストア名に円記号を含めることはできません。 dwFlags の高い単語は、システム ストアの場所 (通常はCERT_SYSTEM_STORE_CURRENT_USER) を示します。 詳細については、このトピックの「 dwFlags 」を参照し、「 System Store の場所」を参照してください。 一部の物理ストアの場所は、リモートで開くことができます。 pvPara 値: pvPara パラメーターは、システム ストア名と物理名の両方を含む null で終わる Unicode 文字列を指します。 |
|
エンコードされた PKCS #7 署名付きメッセージから証明書、CRL、および CCTL を使用してストアを初期化します。 dwEncodingType パラメーターは、メッセージと証明書の両方で使用するエンコードの種類を指定する必要があります。
pvPara 値: pvPara パラメーターは、エンコードされたメッセージを表すCRYPT_DATA_BLOB構造体を指します。 |
|
PKCS #12 パケットの内容を使用してストアを初期化します。
PKCS #12 パケットが NULL または空のパスワードで保護されている場合、この関数はストアを開くことに成功します。 Windows 8 と Windows Server 2012 以降では、PFX パケットに埋め込まれたパスワードが Active Directory (AD) プリンシパルに保護されており、現在のユーザーがそのプリンシパルのメンバーとしてパスワードの暗号化を解除するアクセス許可を持っている場合、この関数はストアを開くことに成功します。 詳細については、pvPara パラメーターと PFXExportCertStoreEx 関数のPKCS12_PROTECT_TO_DOMAIN_SIDS フラグを参照してください。 PFX パスワードは、Windows 8およびWindows Server 2012から AD プリンシパルに保護できます。 pvPara 値: pvPara パラメーターは、PKCS #12 パケットを表すCRYPT_DATA_BLOB構造体を指します。 |
|
レジストリ サブキーから証明書、CRL、および CCTL を使用してストアを初期化します。
このプロバイダーは、pvPara で渡されたキーの下に、レジストリ サブキー証明書、CRL、および CCTL を開くか作成します。 入力キーはプロバイダーによって閉じられません。 返す前に、プロバイダーは pvPara で渡されたキーの独自のコピーを開きます。 CERT_STORE_READONLY_FLAGが dwFlags という低い単語で設定されている場合、レジストリ サブキーは、KEY_READ_ACCESSで RegOpenKey を使用して開かれます。 それ以外の場合、レジストリ サブキーは、KEY_ALL_ACCESSで RegCreateKey を 使用して作成されます。 開いているストアの内容に対する変更は、直ちにレジストリに保持されます。 ただし、 CERT_STORE_READONLY_FLAGが dwFlags の低い単語で設定されている場合、ストアの内容にを追加したり、コンテキストのプロパティを変更しようとすると、 GetLastError がE_ACCESSDENIEDコードを返すというエラーが発生します。 pvPara 値: pvPara パラメーターには、開いているレジストリ キーのハンドルが含まれています。 |
|
シリアル化されたストアを含むメモリの場所から、証明書、CRL、および CCTL を使用してストアを初期化します。
pvPara 値: pvPara パラメーターは、シリアル化されたメモリ BLOB を含むCRYPT_DATA_BLOB構造体を指します。 |
|
現在は使用しません。 |
|
指定したシステム ストアの証明書、CRL、および CCTL を使用してストアを初期化します。
システム ストアは、1 つ以上の物理ストアで構成される論理コレクション ストアです。 システム ストアに関連付けられている物理ストアは、 CertRegisterPhysicalStore 関数に登録されます。 システム ストアを開いた後、それに関連付けられているすべての物理ストアも CertOpenStore の呼び出しによって開き、 CertAddStoreToCollection 関数を使用してシステム ストア コレクションに追加されます。 dwFlags の高い単語は、システム ストアの場所を示し、通常は CERT_SYSTEM_STORE_CURRENT_USER に設定されます。 レジストリの場所の詳細については、このトピックで後述 する dwFlags と システム ストアの場所に関するページを参照してください。 一部のシステム ストアの場所はリモートで開くことができます。詳細については、「システム ストアの場所」を参照してください。 pvPara 値: pvPara パラメーターは、"My" や "Root" などのシステム ストア名を含む null で終わる ANSI 文字列を指します。 |
|
CERT_STORE_PROV_SYSTEM_Aと同じです。
pvPara 値: pvPara パラメーターは、"My" や "Root" などのシステム ストア名を含む null で終わる Unicode 文字列を指します。 |
|
物理レジストリ ストアの証明書、CRL、および CCTL を使用してストアを初期化します。 物理ストアはコレクション ストアとして開かれていません。 列挙と検索は、その 1 つの物理ストア内の証明書、CRL、および CCTL のみを通過します。
dwFlags の高い単語は、システム ストアの場所を示し、通常は CERT_SYSTEM_STORE_CURRENT_USER に設定されます。 詳細については、このトピックで後述 する「dwFlags 」を参照してください。 一部のシステム ストアの場所はリモートで開くことができます。詳細については、「 システム ストアの場所」を参照してください。 pvPara 値: pvPara パラメーターは、"My" や "Root" などのシステム ストア名を含む null で終わる ANSI 文字列を指します。 |
|
CERT_STORE_PROV_SYSTEM_REGISTRY_Aと同じです。
pvPara 値: pvPara パラメーターは、"My" や "Root" などのシステム ストア名を含む null で終わる Unicode 文字列を指します。 |
[in] dwEncodingType
証明書エンコードの 種類 と メッセージ エンコードの種類を指定します。 エンコードは、 CertSaveStore 関数の dwSaveAs パラメーターに CERT_STORE_SAVE_AS_PKCS7が含まれている場合にのみ使用されます。 それ以外の場合、 dwMsgAndCertEncodingType パラメーターは使用されません。
このパラメーターは、lpszStoreProvider パラメーターでCERT_STORE_PROV_MSG、CERT_STORE_PROV_PKCS7、またはCERT_STORE_PROV_FILENAMEプロバイダーの種類が指定されている場合にのみ適用されます。 他のすべてのプロバイダー型では、このパラメーターは使用されず、0 に設定する必要があります。
このパラメーターには、次の値の 1 つ以上の組み合わせを指定できます。
値 | 意味 |
---|---|
|
PKCS #7 メッセージ エンコーディングを指定します。 |
|
X.509 証明書のエンコードを指定します。 |
[in] hCryptProv
このパラメーターは使用されず、 NULL に設定する必要があります。
Windows Server 2003 および Windows XP: 暗号化プロバイダーへのハンドル。 このパラメーターに NULL を 渡すと、適切な既定のプロバイダーが使用されます。 既定のプロバイダーを使用することをお勧めします。 既定または指定された暗号化プロバイダーは、サブジェクト証明書または CRL の署名を検証するすべてのストア関数に使用されます。このパラメーターのデータ型は HCRYPTPROV です。
[in] dwFlags
これらの値は、ビットごとの OR 演算を使用して組み合わせた高ワード値と低ワード値で構成されます。
dwFlags のローワード部分は、開かれた証明書ストアのさまざまな一般的な特性を制御します。 この部分は、すべてのストア プロバイダーの種類で使用できます。 dwFlags のローワード部分には、次のいずれかの値を指定できます。
値 | 意味 |
---|---|
|
レジストリまたはファイル ベースのシステム ストアを開くには、スレッドのSE_BACKUP_NAMEとSE_RESTORE_NAME 特権 を使用します。 スレッドにこれらの特権がない場合、この関数はアクセス拒否エラーで失敗する必要があります。 |
|
存在しない場合は、新しいストアが作成されます。 ストアが既に存在する場合、関数は失敗します。
CERT_STORE_OPEN_EXISTING_FLAGもCERT_STORE_CREATE_NEW_FLAGも設定されていない場合は、ストアが存在する場合は開かれます。存在していない場合は、ストアが作成され、開かれます。 |
|
ストアから取得したすべての証明書、CRL、または CCTL が使用されなくなるまで、ストアのプロバイダーの終了を延期します。 ストアから取得した最後の証明書、CRL、または CTL が解放されると、ストアは実際に閉じられます。 これらの証明書、CRL、および CCTL のプロパティに加えられた変更は、 CertCloseStore の呼び出しの後でも保持されます。
このフラグが設定されておらず、ストアから取得した証明書、CRL、または CCTL がまだ使用されている場合、それらの証明書、CRL、および CCTL のプロパティに対する変更は保持されません。 この関数が CERT_CLOSE_STORE_FORCE_FLAG で呼び出された場合、 CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG は無視されます。 このフラグが設定され、NULL 以外の hCryptProv パラメーター値が渡された場合、そのプロバイダーは、この関数の呼び出し後も引き続き使用されます。 |
|
ストアは開かれるのではなく削除されます。 この関数は、削除の成功と失敗の両方に対して NULL を 返します。 削除の成功を確認するには、 GetLastError を呼び出します。この呼び出しは、ストアが削除された場合は 0、削除されなかった場合は 0 以外の値を返します。 |
|
通常、ストア内のすべての証明書の列挙では、 CERT_ARCHIVED_PROP_ID プロパティが設定された証明書は無視されます。 このフラグが設定されている場合、ストア内の証明書の列挙には、ストア内のすべての証明書 ( CERT_ARCHIVED_PROP_ID プロパティを持つ証明書を含む) が含まれます。 |
|
許可されているアクセス許可の最大セットを使用してストアを開きます。 このフラグが指定されている場合、レジストリ ストアは最初に書き込みアクセス権で開かれます。それが失敗した場合は、読み取り専用アクセスで再度開かれます。 |
|
hCryptProv パラメーターが NULL の場合、このフラグは使用されません。 このフラグは、NULL 以外の CSP ハンドルが hCryptProv パラメーターとして渡される場合にのみ有効です。 このフラグを設定すると、証明書ストアが閉じられたときに既定以外の CSP が自動的にリリースされないようにします。 |
|
既存のストアのみを開きます。 ストアが存在しない場合、関数は失敗します。 |
|
ストアを読み取り専用モードで開きます。 ストアの内容を変更しようとすると、エラーが発生します。 このフラグが設定され、レジストリ ベースのストア プロバイダーが使用されている場合、レジストリ サブキーは、KEY_READ_ACCESSで RegOpenKey を使用して開かれます。 それ以外の場合、レジストリ サブキーは、KEY_ALL_ACCESSで RegCreateKey を使用して作成されます。 |
|
このフラグがサポートされている場合、プロバイダーはストアの CERT_STORE_LOCALIZED_NAME_PROP_ID プロパティを 設定します。 ローカライズされた名前を取得するには、dwPropID を CERT_STORE_LOCALIZED_NAME_PROP_ID に設定して CertGetStoreProperty 関数を呼び出します。 このフラグは、CERT_STORE_PROV_FILENAME、CERT_STORE_PROV_SYSTEM、CERT_STORE_PROV_SYSTEM_REGISTRY、CERT_STORE_PROV_PHYSICAL_Wの種類のプロバイダーでサポートされています。 |
|
ストアを複数回開くときに、このフラグを設定して、ストアの開いているインスタンス全体で証明書、CRL、または CTL コンテキストのエンコードされた部分のメモリを再利用することで、効率的なメモリ使用量を確保できます。 |
|
キー識別子のListsは、CurrentUser と LocalMachine 内に存在します。 これらのキー識別子には、証明書のプロパティとよく似たプロパティがあります。 CERT_STORE_UPDATE_KEYID_FLAGが設定されている場合、CERT_KEY_PROV_INFO_PROP_ID プロパティを持つストアの場所のすべてのキー識別子について、そのプロパティはキー識別子プロパティ CERT_KEY_PROV_INFO_PROP_IDまたはそのキー識別子に関連する証明書のCERT_KEY_IDENTIFIER_PROP_IDから自動的に更新されます。 |
CERT_STORE_PROV_SYSTEM、CERT_STORE_PROV_SYSTEM_REGISTRY、およびCERT_STORE_PROV_PHYSICALプロバイダーの種類では、次の dwFlags の高い単語を使用して、システム ストア レジストリの場所を指定します。
CERT_SYSTEM_STORE_CURRENT_SERVICE
CERT_SYSTEM_STORE_CURRENT_USER
CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY
CERT_SYSTEM_STORE_LOCAL_MACHINE
CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE
CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY
CERT_SYSTEM_STORE_SERVICES
CERT_SYSTEM_STORE_USERS
既定では、システム ストアの場所は、 定義済みのレジストリ キー HKEY_CURRENT_USER、 HKEY_LOCAL_MACHINE、または HKEY_USERS 相対的に開かれます。 詳細については、「 システム ストアの場所」を参照してください。
次の高ワード フラグは、この既定の動作をオーバーライドします。
値 | 意味 |
---|---|
|
設定する場合、 pvPara には文字列ではなく CERT_SYSTEM_STORE_RELOCATE_PARA 構造体へのポインターを含める必要があります。 構造体は、ストアの名前とレジストリ内の場所の両方を示します。 |
|
既定では、CurrentUser "Root" ストアが開かれると、保護されたルート リストにない SystemRegistry ルートはすべて、この関数が返される前にキャッシュから削除されます。 このフラグを設定すると、この既定値がオーバーライドされ、SystemRegistry 内のすべてのルートが返され、保護されたルート リストのチェックは作成されません。 |
CERT_STORE_PROV_REGISTRY プロバイダーは、次の高ワード フラグを使用します。
値 | 意味 |
---|---|
|
pvPara には、リモート コンピューター上のレジストリ キーへのハンドルが含まれています。 リモート コンピューターのレジストリ キーにアクセスするには、リモート コンピューターのセキュリティアクセス許可を設定してアクセスを許可する必要があります。 詳細については、「解説」を参照してください。 |
|
CERT_STORE_PROV_REG プロバイダーは、既定の保存操作を実行する代わりに、証明書、CRL、および CCTL を 1 つのシリアル化されたストア サブキーに保存します。 既定では、各証明書、CRL、または CTL は、適切なサブキーの下に個別のレジストリ サブキーとして保存されます。
このフラグは、主に CurrentUserGroupPolicy ストアや LocalMachineGroupPolicy ストアなど、グループ ポリシー テンプレート (GPT) からダウンロードされたストアに使用されます。 CERT_REGISTRY_STORE_SERIALIZED_FLAGが設定されている場合、ストアの追加、削除、またはプロパティの変更は、CERT_STORE_CTRL_COMMITを使用して CertCloseStore または CertControlStore を呼び出すまで保持されません。 |
CERT_STORE_PROV_FILEおよびCERT_STORE_PROV_FILENAME プロバイダーの種類では、次の高ワード フラグが使用されます。
値 | 意味 |
---|---|
|
このフラグを設定すると、ストアへの追加、またはストア内のコンテキストのプロパティに加えられた変更は、 CertCloseStore が呼び出されたとき、または CertControlStore が CERT_STORE_CONTROL_COMMIT で呼び出されたときに、ファイル ストアにコミットされます。
dwFlags でCERT_FILE_STORE_COMMIT_ENABLEとCERT_STORE_READONLY_FLAGの両方が設定されている場合、CertOpenStore は E_INVALIDARG で失敗します。 |
CERT_STORE_PROV_LDAP プロバイダーの種類では、次の高ワード フラグが使用されます。
値 | 意味 |
---|---|
|
pvPara パラメーターで という名前の URL に対して A レコードのみの DNS 参照を実行します。 これにより、URL ホスト名を解決するときに、偽の DNS クエリが生成されるのを防ぐことができます。 pvPara パラメーターのドメイン名ではなく、ホスト名を渡す場合は、このフラグを使用します。 |
|
既存の LDAP セッションを使用するには、このフラグを使用します。 このフラグを指定すると、 pvPara パラメーターは、使用する LDAP セッションに関する情報を含む CERT_LDAP_STORE_OPENED_PARA 構造体のアドレスです。 |
|
一部のアプリケーションで必要な整合性を提供するには、Kerberos 認証プロトコルを使用して、LDAP サーバーとの間のすべての LDAP トラフィックにデジタル署名します。 |
|
ストアが閉じられたときに LDAP セッションがバインド解除されるようにするには、このフラグを CERT_LDAP_STORE_OPENED_FLAG フラグと共に使用します。 ストアが閉じられると、 システムは ldap_unbind 関数を使用して LDAP セッションのバインドを解除します。 |
[in] pvPara
この関数の追加情報を含めることができる 32 ビット値。 このパラメーターの内容は、 lpszStoreProvider およびその他のパラメーターの値によって異なります。
戻り値
関数が成功した場合、関数は 証明書ストアにハンドルを返します。 ストアの使用が完了したら、 CertCloseStore 関数を呼び出してハンドルを解放します。
関数が失敗した場合は、NULL が返されます。 拡張エラー情報については、 GetLastError を呼び出します。
注釈
システム ストアは、1 つ以上の物理兄弟ストアで構成されるコレクションです。 システム ストアごとに、定義済みの物理兄弟ストアがあります。 CERT_SYSTEM_STORE_CURRENT_USERで "My" などのシステム ストアを開くと、 CertOpenStore が呼び出され、システム ストア コレクション内のすべての物理ストアが開きます。 これらの各物理ストアは、 CertAddStoreToCollection 関数を使用してシステム ストア コレクションに追加されます。 これらの物理ストア内のすべての証明書、CRL、および CCTL は、論理システム ストア コレクションを通じて使用できます。
次のシステム ストアの場所をリモートで開くことができます。
- CERT_SYSTEM_STORE_LOCAL_MACHINE
- CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY
- CERT_SYSTEM_STORE_SERVICES
- CERT_SYSTEM_STORE_USERS
システム ストアの場所は、 pvPara に渡される文字列のストア名の前にコンピューター名を付けることで、リモートで開かれます。 リモート システム ストア名の例を次に示します。
- ComputerName\CA
- \\ComputerName\CA
- ComputerName\ServiceName\Trust
- \\ComputerName\ServiceName\Trust
システム ストアの詳細については、「 System Store の場所」を参照してください。
自動的に移行されるストアの詳細については、「 証明書ストアの移行」を参照してください。
例
次の例は、ストア プロバイダーの種類が異なる複数の証明書ストアを開く方法を示しています。 この例では、「DACL の作成」トピックで定義されている CreateMyDACL 関数を使用して、開いているファイルが適切な DACL で作成されるようにします。 他のストア プロバイダーの種類を開く例については、「 証明書ストアを開くための C コードの例」を参照してください。
//-------------------------------------------------------------------
// Open a system store, in this case, the My store.
HCERTSTORE hSysStore = NULL;
if(hSysStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM, // The store provider type
0, // The encoding type is
// not needed
NULL, // Use the default HCRYPTPROV
CERT_SYSTEM_STORE_CURRENT_USER, // Set the store location in a
// registry location
L"MY" // The store name as a Unicode
// string
))
{
printf("The system store was created successfully.\n");
}
else
{
printf("An error occurred during creation "
"of the system store!\n");
exit(1);
}
// Other common system stores include "Root", "Trust", and "Ca".
//-------------------------------------------------------------------
// Open a memory store.
HCERTSTORE hMemStore = NULL;
if(hMemStore = CertOpenStore(
CERT_STORE_PROV_MEMORY, // The memory provider type
0, // The encoding type is not needed
NULL, // Use the default HCRYPTPROV
0, // Accept the default dwFlags
NULL // pvPara is not used
))
{
printf("The memory store was created successfully.\n");
}
else
{
printf("An error occurred during creation "
"of the memory store!\n");
exit(1);
}
//-------------------------------------------------------------------
// Open a read-only store from disk.
HANDLE hFile = NULL;
HCERTSTORE hFileStore = NULL;
LPCSTR pszFileName = "TestStor2.sto";
SECURITY_ATTRIBUTES sa; // For DACL
// Create a DACL to use when opening the file.
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE;
// Call function to set the DACL. The DACL is set in the
// SECURITY_ATTRIBUTES lpSecurityDescriptor member.
if (!CreateMyDACL(&sa))
{
// Error encountered; generate message and exit.
printf("Failed CreateMyDACL.\n");
exit(1);
}
// Obtain the file handle of an existing file.
if (hFile = CreateFile(
pszFileName, // The file name
GENERIC_READ|GENERIC_WRITE, // Access mode: Read from and
// write to this file
0, // Share mode
&sa, // Uses the DACL created
// previously
OPEN_ALWAYS, // How to create
FILE_ATTRIBUTE_NORMAL, // File attributes
NULL)) // Template
{
printf("The file was opened successfully.\n");
}
else
{
printf("An error occurred during opening of the file!\n");
exit(1);
}
//-------------------------------------------------------------------
// This file can contain data before the store itself.
// At this point, read and use data in the open file that precedes
// the serialized certificate store data.
// To open the certificate store, the file pointer must
// be placed at the beginning of the certificate store data.
//-------------------------------------------------------------------
// Open the store.
if(hFileStore = CertOpenStore(
CERT_STORE_PROV_FILE, // Load certificates from a file
0, // Encoding type not used
NULL, // Use the default HCRYPTPROV
CERT_STORE_READONLY_FLAG, // Read-only store
hFile // The handle for the open file
// that is the source of the
// certificates
))
{
printf("The file store was created successfully.\n");
}
else
{
printf("An error occurred during creation of the file store!\n");
exit(1);
}
//-------------------------------------------------------------------
// After processing, close the certificate stores and the file.
if(CertCloseStore(
hSysStore,
CERT_CLOSE_STORE_CHECK_FLAG))
{
printf("The system store was closed successfully.\n");
}
else
{
printf("An error occurred during closing of the "
"system store.\n");
}
if(CertCloseStore(
hMemStore,
CERT_CLOSE_STORE_CHECK_FLAG))
{
printf("The memory store was closed successfully.\n");
}
else
{
printf("An error occurred during closing of the "
"memory store.\n");
}
if(CertCloseStore(
hFileStore,
CERT_CLOSE_STORE_CHECK_FLAG))
{
printf("The file store was closed successfully.\n");
}
else
{
printf("An error occurred during closing of the file store.\n");
}
if(CloseHandle(hFile))
{
printf("The file was closed successfully.\n");
}
else
{
printf("An error occurred during closing of the file.\n");
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP [デスクトップ アプリ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | wincrypt.h |
Library | Crypt32.lib |
[DLL] | Crypt32.dll |
こちらもご覧ください
フィードバック
https://aka.ms/ContentUserFeedback。
近日公開予定: 2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub イシューを段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、以下を参照してください:フィードバックの送信と表示