CertFindCertificateInStore-Funktion (wincrypt.h)
Die funktion CertFindCertificateInStore findet das erste oder nächste Zertifikat Kontext in einem Zertifikatspeicher, das einem Suchkriterium entspricht, das von der dwFindType und den zugehörigen pvFindParafestgelegt wurde. Diese Funktion kann in einer Schleife verwendet werden, um alle Zertifikate zu finden, in einem Zertifikatspeicher, die den angegebenen Suchkriterien entsprechen.
Syntax
PCCERT_CONTEXT CertFindCertificateInStore(
[in] HCERTSTORE hCertStore,
[in] DWORD dwCertEncodingType,
[in] DWORD dwFindFlags,
[in] DWORD dwFindType,
[in] const void *pvFindPara,
[in] PCCERT_CONTEXT pPrevCertContext
);
Parameter
[in] hCertStore
Ein Handle des Zertifikatspeichers, durchsucht werden soll.
[in] dwCertEncodingType
Gibt den Typ der verwendeten Codierung an. Sowohl das Zertifikat als auch Nachrichtencodierungstypen müssen angegeben werden, indem sie mit einem bitweisenODER--Vorgang kombiniert werden, wie im folgenden Beispiel gezeigt:
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING Derzeit definierte Codierungstypen sind:
- X509_ASN_ENCODING
- PKCS_7_ASN_ENCODING
[in] dwFindFlags
Wird mit einigen dwFindType- Werten verwendet, um die Suchkriterien zu ändern. Für die meisten dwFindType--Werte wird dwFindFlags- nicht verwendet und sollte auf Null festgelegt werden. Ausführliche Informationen finden Sie in den Hinweisen.
[in] dwFindType
Gibt den Suchtyp an, der erstellt wird. Der Suchtyp bestimmt den Datentyp, den Inhalt und die Verwendung von pvFindPara. Dieser Parameter kann einer der folgenden Werte sein:
Wert | Bedeutung |
---|---|
|
Datentyp von pvFindPara: NULLnicht verwendet.
Es werden keine Suchkriterien verwendet. Gibt das nächste Zertifikat im Speicher zurück.
Hinweis Die Reihenfolge des Zertifikatkontexts bleibt möglicherweise nicht im Speicher erhalten.
Um auf ein bestimmtes Zertifikat zuzugreifen, müssen Sie die Zertifikate im Speicher durchlaufen.
|
|
Datentyp des pvFindPara: CERT_ID Struktur.
Suchen Sie das von der angegebenen CERT_IDidentifizierte Zertifikat. |
|
Datentyp von pvFindPara: CTL_USAGE Struktur.
Sucht nach einem Zertifikat mit einer szOID_ENHANCED_KEY_USAGE Erweiterung oder einer CERT_CTL_PROP_ID, die dem pszUsageIdentifier Mitglied der CTL_USAGE-Struktur entspricht. |
|
Datentyp der pvFindPara-: CERT_ENHKEY_USAGE Struktur.
Sucht nach einem Zertifikat im Speicher, das entweder über eine erweiterte Schlüsselverwendung Erweiterung oder eine eigenschaft für die erweiterte Schlüsselverwendung verfügt, und einen Verwendungsbezeichner, der dem cUsageIdentifier Member in der CERT_ENHKEY_USAGE Struktur entspricht. Ein Zertifikat verfügt über eine erweiterte Schlüsselverwendungserweiterung, wenn es eine CERT_EXTENSION Struktur mit dem pszObjId Member auf szOID_ENHANCED_KEY_USAGE festgelegt hat. Ein Zertifikat verfügt über eine erweiterte Schlüsselverwendungseigenschaft, wenn der CERT_ENHKEY_USAGE_PROP_ID Bezeichner festgelegt ist. Wenn CERT_FIND_OPTIONAL_ENHKEY_USAGE_FLAG in dwFindFlagsfestgelegt wird, werden Zertifikate ohne die Schlüsselverwendungserweiterung oder -eigenschaft ebenfalls übereinstimmen. Das Festlegen dieses Flags hat Vorrang vor der Übergabe NULL- in pvFindPara-. Wenn CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG festgelegt ist, erfolgt eine Übereinstimmung nur für die Schlüsselverwendungserweiterung. Informationen zu Kennzeichnungsänderungen an Suchkriterien finden Sie in den Hinweisen. |
|
Datentyp von pvFindPara: CERT_CONTEXT Struktur.
Sucht nach einem Zertifikat, das genau mit dem angegebenen Zertifikatkontext übereinstimmt. |
|
Datentyp des pvFindPara: CRYPT_HASH_BLOB Struktur.
Sucht nach einem Zertifikat mit einem SHA1-Hash, der dem Hash in der CRYPT_HASH_BLOB-Struktur entspricht. |
|
Datentyp von pvFindPara: NULLnicht verwendet.
Sucht nach einem Zertifikat mit einem privaten Schlüssel. Der Schlüssel kann kurzlebig sein oder auf dem Datenträger gespeichert werden. Der Schlüssel kann ein legacy-Kryptografie-API-Schlüssel (CAPI) oder ein CNG-Schlüssel sein.
Hinweis Die Reihenfolge des Zertifikatkontexts bleibt möglicherweise nicht im Speicher erhalten. Daher müssen Sie für den Zugriff auf ein bestimmtes Zertifikat alle Zertifikate durchlaufen.
|
|
Datentyp des pvFindPara-: CERT_RDN Struktur.
Sucht nach einem Zertifikat mit angegebenen Ausstellerattributen, die Attribute in der CERT_RDN Struktur entsprechen. Wenn diese Werte festgelegt sind, vergleicht die Funktion Attribute des Ausstellers in einem Zertifikat mit Elementen des CERT_RDN_ATTR Arrays in dieser CERT_RDN Struktur. Vergleiche durchlaufen die CERT_RDN_ATTR Attribute, die nach einer Übereinstimmung mit den Ausstellerattributen des Zertifikats suchen. Wenn das pszObjId Member von CERT_RDN_ATTRNULL-ist, wird der Attributobjektbezeichner ignoriert. Wenn der dwValueType Member von CERT_RDN_ATTR CERT_RDN_ANY_TYPE ist, wird der Werttyp ignoriert. Wenn das pbData- Mitglied von CERT_RDN_VALUE_BLOBNULL-ist, ist jeder Wert eine Übereinstimmung. Derzeit wird nur eine genaue Übereinstimmung zwischen Groß- und Kleinschreibung unterstützt. Informationen zu Unicode-Optionen finden Sie in den Hinweisen. Wenn diese Werte festgelegt werden, wird die Suche auf Zertifikate beschränkt, deren Codierungstyp dwCertEncodingTypeentspricht. |
|
Datentyp des pvFindPara: CERT_NAME_BLOB Struktur.
Suchen Sie nach einem Zertifikat mit einer exakten Übereinstimmung des gesamten Ausstellernamens mit dem Namen in CERT_NAME_BLOB Die Suche ist auf Zertifikate beschränkt, die mit dem dwCertEncodingTypeübereinstimmen. |
|
Datentyp von pvFindPara: CERT_CONTEXT Struktur.
Sucht nach einem Zertifikat mit einem Betreff, der dem Aussteller in CERT_CONTEXTentspricht. Anstatt CertFindCertificateInStore- mit diesem Wert zu verwenden, verwenden Sie die CertGetCertificateChain--Funktion. |
|
Datentyp von pvFindPara: Null-gekündigte Unicode-Zeichenfolge.
Sucht nach einem Zertifikat, das die angegebene Ausstellernamenzeichenfolge enthält. Das Ausstellermitglied des Zertifikats wird mithilfe der entsprechenden Form von CertNameToStr als CERT_SIMPLE_NAME_STR formatiert in eine Namenszeichenfolge des entsprechenden Typs konvertiert. Anschließend wird eine Zwischenzeichenfolgenüberstimmung zwischen Groß- und Kleinschreibung durchgeführt. Wenn dieser Wert festgelegt ist, ist die Suche auf Zertifikate beschränkt, deren Codierungstyp dwCertEncodingTypeentspricht. Wenn die Teilzeichenfolgenüberstimmung fehlschlägt und der Betreff eine E-Mail-RDN mit punycode-codierter Zeichenfolge enthält, wird CERT_NAME_STR_ENABLE_PUNYCODE_FLAG verwendet, um den Betreff in eine Unicode-Zeichenfolge zu konvertieren, und die Teilzeichenfolgenüberstimmung wird erneut ausgeführt. |
|
Datentyp des pvFindPara: CRYPT_HASH_BLOB Struktur.
Sucht nach einem Zertifikat mit einer CERT_KEY_IDENTIFIER_PROP_ID-Eigenschaft, die dem Schlüsselbezeichner in CRYPT_HASH_BLOBentspricht. |
|
Datentyp von pvFindPara: DWORD Variable, die eine Schlüsselspezifikation enthält.
Sucht nach einem Zertifikat mit einer CERT_KEY_SPEC_PROP_ID Eigenschaft, die der Schlüsselspezifikation in pvFindParaentspricht. |
|
Datentyp des pvFindPara: CRYPT_HASH_BLOB Struktur.
Sucht nach einem Zertifikat mit einem MD5-Hash, der dem Hash in CRYPT_HASH_BLOBentspricht. |
|
Datentyp des pvFindPara-: DWORD- Variable, die einen Eigenschaftsbezeichner enthält.
Sucht nach einem Zertifikat mit einer Eigenschaft, die dem durch den DWORD- Wert in pvFindPara-angegebenen Eigenschaftsbezeichner entspricht. |
|
Datentyp von pvFindPara: CERT_PUBLIC_KEY_INFO Struktur.
Sucht nach einem Zertifikat mit einem öffentlichen Schlüssel, der dem öffentlichen Schlüssel in der CERT_PUBLIC_KEY_INFO-Struktur entspricht. |
|
Datentyp des pvFindPara: CRYPT_HASH_BLOB Struktur.
Sucht nach einem Zertifikat mit einem SHA1-Hash, der dem Hash in der CRYPT_HASH_BLOB-Struktur entspricht. |
|
Datentyp des pvFindPara: CRYPT_HASH_BLOB Struktur.
Sucht nach einem Zertifikat mit einem SHA1 + SHA256-Hash, der dem Hash in der CRYPT_HASH_BLOB-Struktur entspricht. |
|
Datentyp des pvFindPara: CRYPT_HASH_BLOB Struktur.
Sucht nach einem Zertifikat mit einem SHA256-Hash, der dem Hash in der CRYPT_HASH_BLOB-Struktur entspricht. |
|
Datentyp des pvFindPara: CRYPT_HASH_BLOB Struktur.
Sucht nach einem Zertifikat mit einem Signaturhash, der dem Signaturhash in der CRYPT_HASH_BLOB-Struktur entspricht. |
|
Datentyp des pvFindPara-: CERT_RDN Struktur.
Sucht nach einem Zertifikat mit angegebenen Betreffattributen, die Attribute in der CERT_RDN Struktur entsprechen. Wenn RDN-Werte festgelegt werden, vergleicht die Funktion Attribute des Betreffs in einem Zertifikat mit Elementen des CERT_RDN_ATTR Arrays in dieser CERT_RDN Struktur. Vergleiche durchlaufen die CERT_RDN_ATTR Attribute, die nach einer Übereinstimmung mit den Attributen des Zertifikatsbetreffs suchen. Wenn das pszObjId Member von CERT_RDN_ATTRNULL-ist, wird der Attributobjektbezeichner ignoriert. Wenn der dwValueType Member von CERT_RDN_ATTR CERT_RDN_ANY_TYPE ist, wird der Werttyp ignoriert. Wenn das pbData- Mitglied von CERT_RDN_VALUE_BLOBNULL-ist, ist jeder Wert eine Übereinstimmung. Derzeit wird nur eine genaue Übereinstimmung zwischen Groß- und Kleinschreibung unterstützt. Informationen zu Unicode-Optionen finden Sie in den Hinweisen. Wenn diese Werte festgelegt werden, wird die Suche auf Zertifikate beschränkt, deren Codierungstyp dwCertEncodingTypeentspricht. |
|
Datentyp von pvFindPara: CERT_INFO Struktur.
Sucht nach einem Zertifikat mit einem Aussteller und einer Seriennummer, die dem Aussteller und der Seriennummer in der CERT_INFO Struktur entspricht. |
|
Datentyp des pvFindPara: CERT_NAME_BLOB Struktur.
Sucht nach einem Zertifikat mit einer exakten Übereinstimmung des gesamten Antragstellernamens mit dem Namen in der CERT_NAME_BLOB-Struktur. Die Suche ist auf Zertifikate beschränkt, die dem Wert von dwCertEncodingTypeentsprechen. |
|
Datentyp von pvFindPara: Null-gekündigte Unicode-Zeichenfolge.
Sucht nach einem Zertifikat, das die angegebene Antragstellernamenzeichenfolge enthält. Das Antragstellerelement des Zertifikats wird mithilfe der entsprechenden Form von CertNameToStr- als CERT_SIMPLE_NAME_STR formatiert in eine Namenszeichenfolge des entsprechenden Typs konvertiert. Anschließend wird eine Zwischenzeichenfolgenüberstimmung zwischen Groß- und Kleinschreibung durchgeführt. Wenn dieser Wert festgelegt ist, ist die Suche auf Zertifikate beschränkt, deren Codierungstyp dwCertEncodingTypeentspricht. |
|
Datentyp von pvFindPara: Nicht verwendet.
Suchen Sie ein Zertifikat mit einer zertifikatübergreifenden Verteilungspunkterweiterung oder -eigenschaft. |
|
Datentyp des pvFindPara: CRYPT_HASH_BLOB Struktur.
Suchen Sie ein Zertifikat, dessen öffentlicher SCHLÜSSEL mit MD5-Hash mit dem angegebenen Hash übereinstimmt. |
[in] pvFindPara
Verweist auf ein Datenelement oder eine Struktur, die mit dwFindTypeverwendet wird.
[in] pPrevCertContext
Ein Zeiger auf die letzte CERT_CONTEXT Struktur, die von dieser Funktion zurückgegeben wird. Dieser Parameter muss NULL- für den ersten Aufruf der Funktion sein. Um nach aufeinander folgenden Zertifikaten zu suchen, die den Suchkriterien entsprechen, legen Sie pPrevCertContext auf den Zeiger fest, der vom vorherigen Aufruf der Funktion zurückgegeben wird. Diese Funktion gibt die CERT_CONTEXT frei, auf die durch nicht-NULL- Werte dieses Parameters verwiesen wird.
Rückgabewert
Wenn die Funktion erfolgreich ist, gibt die Funktion einen Zeiger auf eine schreibgeschützte CERT_CONTEXT Struktur zurück.
Wenn die Funktion fehlschlägt und ein Zertifikat, das den Suchkriterien entspricht, nicht gefunden wird, wird der Rückgabewert NULL.
Ein nichtNULL-CERT_CONTEXT, das CertFindCertificateInStore- zurückgegeben wird, muss durch CertFreeCertificateContext- oder durch Übergeben als pPrevCertContext-Parameter für einen nachfolgenden Aufruf von CertFindCertificateInStorefreigegeben werden.
Rufen Sie für erweiterte Fehlerinformationen GetLastError-auf. Einige mögliche Fehlercodes folgen.
Rückgabecode | Beschreibung |
---|---|
|
Es wurde kein Zertifikat gefunden, das den Suchkriterien entsprach. Dies kann passieren, wenn der Speicher leer ist oder das Ende der Liste des Stores erreicht ist. |
|
Das Handle im hCertStore--Parameter ist nicht identisch mit dem im Zertifikat Kontext auf den pPrevCertContext Parameter verwiesen wurde oder ein ungültiger Wert im dwFindType-Parameter angegeben wurde. |
Bemerkungen
Der dwFindFlags Parameter wird verwendet, um die Kriterien einiger Suchtypen zu ändern.
Der CERT_UNICODE_IS_RDN_ATTRS_FLAG dwFindFlags Wert wird nur mit den werten CERT_FIND_SUBJECT_ATTR und CERT_FIND_ISSUER_ATTR für dwFindTypeverwendet. CERT_UNICODE_IS_RDN_ATTRS_FLAG muss festgelegt werden, wenn die CERT_RDN_ATTR Struktur, auf die pvFindPara verweist, mit Unicode-Zeichenfolgen initialisiert wurde. Bevor ein Vergleich durchgeführt wird, wird die abzugleichende Zeichenfolge mithilfe von X509_UNICODE_NAME konvertiert, um Unicode-Vergleiche bereitzustellen.
Die folgenden dwFindFlags Werte werden nur mit dem CERT_FIND_ENKEY_USAGE Wert für dwFindTypeverwendet:
CertDuplicateCertificateContext- kann aufgerufen werden, um ein Duplikat des zurückgegebenen Kontexts zu erstellen. Der zurückgegebene Kontext kann einem anderen Zertifikatspeicher mithilfe von CertAddCertificateContextToStore-hinzugefügt werden, oder ein Link zu diesem Zertifikatkontext kann einem Speicher hinzugefügt werden, der kein Sammlungsspeicher ist, indem CertAddCertificateLinkToStoreverwendet wird.
Der zurückgegebene Zeiger wird beim Übergeben als pPrevCertContext Parameter für einen nachfolgenden Aufruf der Funktion freigegeben. Andernfalls muss der Zeiger explizit durch Aufrufen CertFreeCertificateContextfreigegeben werden. Eine pPrevCertContext-, die nicht NULL- ist, wird immer von CertFindCertificateInStore mithilfe eines Aufrufs von CertFreeCertificateContextfreigegeben, auch wenn in der Funktion ein Fehler auftritt.
Beispiele
Das folgende Beispiel zeigt das Suchen eines Zertifikatkontexts im Zertifikatspeicher, das ein Suchkriterium erfüllt. Ein vollständiges Beispiel, das den Kontext für dieses Beispiel enthält, finden Sie unter Beispiel-C-Programm: Zertifikatspeichervorgänge.
Ein weiteres Beispiel, das diese Funktion verwendet, finden Sie unter Beispiel C-Programm: Sammlungs- und Gleichgeordnete Zertifikatspeichervorgänge.
#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>
#pragma comment(lib, "crypt32.lib")
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void main()
{
//-------------------------------------------------------------------
// Declare and initialize variables.
HCERTSTORE hSystemStore; // The system store handle.
PCCERT_CONTEXT pDesiredCert = NULL; // Set to NULL for the first
// call to
// CertFindCertificateInStore.
LPCSTR lpszCertSubject = (LPCSTR) "Cert_subject_1";
//-------------------------------------------------------------------
// Open the certificate store to be searched.
if(hSystemStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0, // Encoding type not needed
// with this PROV.
NULL, // Accept the default HCRYPTPROV.
CERT_SYSTEM_STORE_CURRENT_USER,
// Set the system store location in
// the registry.
L"MY")) // Could have used other predefined
// system stores
// including Trust, CA, or Root.
{
printf("Opened the MY system store. \n");
}
else
{
printf( "Could not open the MY system store.\n");
exit(1);
}
//-------------------------------------------------------------------
// Get a certificate that has lpszCertSubject as its
// subject.
if(pDesiredCert=CertFindCertificateInStore(
hSystemStore,
MY_ENCODING_TYPE, // Use X509_ASN_ENCODING.
0, // No dwFlags needed.
CERT_FIND_SUBJECT_STR, // Find a certificate with a
// subject that matches the string
// in the next parameter.
lpszCertSubject , // The Unicode string to be found
// in a certificate's subject.
NULL)) // NULL for the first call to the
// function. In all subsequent
// calls, it is the last pointer
// returned by the function.
{
printf("The desired certificate was found. \n");
}
else
{
printf("Could not find the desired certificate.\n");
}
//-------------------------------------------------------------------
// Clean up.
if(pDesiredCert)
CertFreeCertificateContext(pDesiredCert);
if(hSystemStore)
CertCloseStore(
hSystemStore,
CERT_CLOSE_STORE_CHECK_FLAG);
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Windows XP [Desktop-Apps | UWP-Apps] |
mindestens unterstützte Server- | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
Zielplattform- | Fenster |
Header- | wincrypt.h |
Library | Crypt32.lib |
DLL- | Crypt32.dll |
Siehe auch
CertAddCertificateContextToStore-
CertAddCertificateLinkToStore-