CertOpenStore 関数 (wincrypt.h)
構文
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 パラメーターの上位ワードの使用と意味が決まります。 追加のストア プロバイダーは、
価値 | 意味 |
---|---|
|
他のストアのコレクションとなるストアを開きます。 ストアは、 dwFlags の高い単語は 0 に設定されます。 |
|
指定した開いているファイルから読み取られた証明書、CRL、および CCTL を使用してストアを初期化します。 このプロバイダーは、ファイルに、PKCS #7 署名済みメッセージまたは単一のエンコードされた証明書ではなく、シリアル化されたストアのみを含む必要があります。
ファイル ポインターは、シリアル化されたストア情報の先頭に配置する必要があります。 シリアル化されたストア内のデータが証明書ストアに読み込まれた後、ファイル ポインターは、ファイル内のシリアル化されたストア データに従うことができるすべてのデータの先頭に配置されます。 CERT_FILE_STORE_COMMIT_ENABLEが dwFlags |
|
ファイルから証明書、CRL、および CCTL を使用してストアを初期化します。 プロバイダーはファイルを開き、最初にシリアル化されたストアとしてファイルを読み取り、次に PKCS #7 の署名付きメッセージとして、最後に 1 つのエンコードされた証明書として読み取ろうとします。
dwEncodingType パラメーターには、メッセージと証明書の両方で使用するエンコードの種類が含まれている必要があります。 ファイルに X.509 エンコードされた証明書が含まれている場合、開いている操作は失敗し、GetLastError 関数の呼び出しは ERROR_ACCESS_DENIEDを返します。
dwFlags pvPara 値: pvPara パラメーターには、開いていない既存のファイルの名前を含む null で終わる ANSI 文字列へのポインターが含まれている必要があります。 |
|
CERT_STORE_PROV_FILENAME_Aと同じです。
pvPara 値: pvPara パラメーターには、既存の未開ファイルの名前を含む null で終わる Unicode 文字列へのポインターが含まれている必要があります。 |
|
LDAP クエリの結果から証明書、CRL、および CCTL を使用してストアを初期化します。
ストアに対して書き込み操作を実行するには、クエリ文字列でフィルターと 1 つの属性を持たない BASE クエリを指定する必要があります。 それ以外の場合は、pvPara |
|
キャッシュされたメモリに証明書ストアを作成します。 証明書、証明書失効リスト (CRL)、証明書信頼リスト (CCTL) は、最初はストアに読み込まれません。 通常、一時ストアを作成するために使用されます。
証明書、CRL、または CCTL の追加、またはメモリ ストア内の証明書、CRL、または CCTL のプロパティの変更は、自動的には保存されません。 CertSaveStoreを使用して、ファイルまたは BLOB pvPara 値: pvPara パラメーターは使用されません。 |
|
指定した暗号化メッセージの証明書、CRL、および CTL を使用してストアを初期化します。
dwEncodingType パラメーターには、メッセージと証明書の両方で使用されるエンコードの種類を含める必要があります。
|
|
論理システム ストアのメンバーである指定された物理ストアの証明書、CRL、および CCTL を使用してストアを初期化します。
2 つの名前は、"Root.Default" などの円記号 (\) で区切ります。 ここで、"Root" はシステム ストアと " の名前です。Default" は物理ストアの名前です。 システム名と物理ストア名に円記号を含めることはできません。 dwFlags の高い単語は、システム ストアの場所 (通常はCERT_SYSTEM_STORE_CURRENT_USER) を示します。 詳細については、このトピックで後述 dwFlags を参照し、「システム ストアの場所」を参照してください。 一部の物理ストアの場所はリモートで開くことができます。 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 フラグを参照してください。 Windows 8 および Windows Server 2012 以降では、AD プリンシパルに対する PFX パスワードを保護できます。 pvPara 値: pvPara パラメーターは、PKCS #12 パケットを表す CRYPT_DATA_BLOB 構造体を指します。 |
|
レジストリ サブキーから証明書、CRL、および CCTL を使用してストアを初期化します。
このプロバイダーは、 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 演算を使用して組み合わされた高ワード値と低ワード値で構成されます。
価値 | 意味 |
---|---|
|
レジストリまたはファイル ベースのシステム ストアを開くには、スレッドのSE_BACKUP_NAMEとSE_RESTORE_NAME の特権 を使用します。 スレッドにこれらの権限がない場合、この関数はアクセス拒否エラーで失敗する必要があります。 |
|
新しいストアが存在しない場合は、新しいストアが作成されます。 ストアが既に存在する場合、関数は失敗します。
CERT_STORE_OPEN_EXISTING_FLAG も CERT_STORE_CREATE_NEW_FLAG も設定されていない場合は、ストアが存在する場合は開かれます。存在しない場合は作成され、開かれます。 |
|
ストアから取得したすべての証明書、CRL、または CCTL が使用されなくなるまで、ストアのプロバイダーの終了を延期します。 ストアから取得した最後の証明書、CRL、または CTL が解放されると、ストアは実際に閉じられます。
CertCloseStoreの呼び出しの後でも、これらの証明書、CRL、および CCTL のプロパティに加えられた変更は保持されます。
このフラグが設定されておらず、ストアから取得した証明書、CRL、または CCTL がまだ使用されている場合、それらの証明書、CRL、および CCTL のプロパティに対する変更は保持されません。 この関数が CERT_CLOSE_STORE_FORCE_FLAGで呼び出された場合、CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG は無視されます。 このフラグが設定され、hCryptProv パラメーター値 |
|
ストアは、開かれるのではなく削除されます。 この関数は、削除の成功と失敗の両方 NULL を返します。 削除の成功を確認するには、GetLastError |
|
通常、ストア内のすべての証明書の列挙では、CERT_ARCHIVED_PROP_ID プロパティが設定された証明書は無視されます。 このフラグが設定されている場合、ストア内の証明書の列挙には、ストア内のすべての証明書 (CERT_ARCHIVED_PROP_ID プロパティを持つ証明書を含む) が含まれます。 |
|
許可されているアクセス許可の最大セットでストアを開きます。 このフラグが指定されている場合、レジストリ ストアは最初に書き込みアクセス権で開き、失敗した場合は読み取り専用アクセスで再び開かれます。 |
|
このフラグは、 |
|
既存のストアのみを開きます。 ストアが存在しない場合、関数は失敗します。 |
|
ストアを読み取り専用モードで開きます。 ストアの内容を変更しようとすると、エラーが発生します。 このフラグが設定され、レジストリ ベースのストア プロバイダーが使用されている場合、レジストリ サブキーは、KEY_READ_ACCESSRegOpenKey を使用して開かれます。 それ以外の場合、レジストリ サブキーは、KEY_ALL_ACCESSRegCreateKey を使用して作成されます。 |
|
このフラグがサポートされている場合、プロバイダーはストアの 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 コンテキストのエンコードされた部分のメモリを再利用することで、効率的なメモリ使用量を確保できます。 |
|
キー識別子のリストは、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 基準として開かれます。 詳細については、「システム ストアの場所の」を参照してください。
次の高ワード フラグは、この既定の動作をオーバーライドします。
CERT_STORE_PROV_REGISTRY プロバイダーは、次の高ワード フラグを使用します。
CERT_STORE_PROV_FILE および CERT_STORE_PROV_FILENAME プロバイダーの種類では、次の高ワード フラグが使用されます。
CERT_STORE_PROV_LDAP プロバイダーの種類では、次の高ワード フラグを使用します。
価値 | 意味 |
---|---|
|
pvPara パラメーターで指定された URL に対して A レコードのみの DNS 参照を実行します。 これにより、URL ホスト名を解決するときに、偽の DNS クエリが生成されなくなります。 このフラグは、pvPara パラメーターのドメイン名ではなく、ホスト名を渡すときに使用します。 |
|
既存の LDAP セッションを使用するには、このフラグを使用します。 このフラグを指定すると、pvPara パラメーターは、使用する LDAP セッションに関する情報を含む CERT_LDAP_STORE_OPENED_PARA 構造体のアドレスです。 |
|
一部のアプリケーションで必要な整合性を提供するには、Kerberos 認証プロトコルを使用して、LDAP サーバーとの間のすべての LDAP トラフィックにデジタル署名します。 |
|
このフラグを CERT_LDAP_STORE_OPENED_FLAG フラグと共に使用して、ストアが閉じられたときに LDAP セッションがバインド解除されるようにします。 システムは、ストアが閉じられたときに、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
システム ストアの詳細については、「システム ストアの場所の
自動的に移行されるストアの詳細については、「証明書ストアの移行」を参照してください。
例
次の例は、ストア プロバイダーの種類が異なる複数の証明書ストアを開く方法を示しています。 この例では、「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 アプリ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | wincrypt.h |
ライブラリ | Crypt32.lib |
DLL | Crypt32.dll |