CertGetSubjectCertificateFromStore-Funktion (wincrypt.h)
Die CertGetSubjectCertificateFromStore-Funktion gibt aus einem Zertifikatspeicher einen Antragstellerzertifikatkontext zurück, der eindeutig durch den Aussteller und die Seriennummer identifiziert wird.
Syntax
PCCERT_CONTEXT CertGetSubjectCertificateFromStore(
[in] HCERTSTORE hCertStore,
[in] DWORD dwCertEncodingType,
[in] PCERT_INFO pCertId
);
Parameter
[in] hCertStore
Ein Handle eines Zertifikatspeichers.
[in] dwCertEncodingType
Der verwendete Codierungstyp. Es ist immer akzeptabel, sowohl den Zertifikat- als auch den Nachrichtencodierungstyp anzugeben, indem sie mit einem bitweisen OR-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] pCertId
Ein Zeiger auf eine CERT_INFO-Struktur . Es werden nur die Member Issuer und SerialNumber verwendet.
Rückgabewert
Wenn die Funktion erfolgreich ist, gibt die Funktion einen Zeiger auf einen schreibgeschützten CERT_CONTEXT zurück. Die CERT_CONTEXT muss durch Aufrufen von CertFreeCertificateContext freigegeben werden.
Das zurückgegebene Zertifikat ist möglicherweise ungültig. In der Regel wird sie beim Abrufen des Ausstellerzertifikats (CertGetIssuerCertificateFromStore) überprüft.
Rufen Sie GetLastError auf, um erweiterte Fehlerinformationen zu erhalten. Ein möglicher Fehlercode ist der folgende.
Rückgabecode | Beschreibung |
---|---|
|
Das Antragstellerzertifikat wurde im Speicher nicht gefunden. |
Hinweise
CertDuplicateCertificateContext kann aufgerufen werden, um ein doppeltes Zertifikat zu erstellen.
Beispiele
Das folgende Beispiel zeigt das Abrufen des Zertifikatkontexts eines Antragstellers, der eindeutig durch den Aussteller und die Seriennummer identifiziert wird, aus dem Zertifikatspeicher. Ein Beispiel, das den vollständigen Kontext für dieses Beispiel enthält, finden Sie unter Beispiel-C-Programm: Signieren, Codieren, Decodieren und Überprüfen einer Nachricht.
#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void main()
{
//-------------------------------------------------------------------
// Declare and initialize variables.
HCERTSTORE hStoreHandle; // certificate store handle
HCRYPTMSG hMsg;
PCCERT_CONTEXT pSignerCertContext;
DWORD cbSignerCertInfo;
PCERT_INFO pSignerCertInfo;
//-------------------------------------------------------------------
// This code is based on hMsg being a signed, encoded message
// read from a file or otherwise acquired. For detailed code, see
// "Example C Program: Signing, Encoding, Decoding, and Verifying a
// Message."
//-------------------------------------------------------------------
// Retrieve the signer CERT_INFO from the message by first getting
// the size of the memory required for the certificate.
if(CryptMsgGetParam(
hMsg, // handle to the message
CMSG_SIGNER_CERT_INFO_PARAM, // parameter type
0, // index
NULL,
&cbSignerCertInfo)) // size of the returned information
{
printf("%d bytes needed for the buffer.\n", cbSignerCertInfo);
}
else
{
printf("Verify SIGNER_CERT_INFO #1 failed\n");
exit(1);
}
//-------------------------------------------------------------------
// Allocate memory.
pSignerCertInfo = (PCERT_INFO) malloc(cbSignerCertInfo);
if (!pSignerCertInfo)
{
printf("Verify memory allocation failed.\n");
exit(1);
}
//-------------------------------------------------------------------
// Get the message certificate information (CERT_INFO
// structure).
if(!(CryptMsgGetParam(
hMsg, // handle to the message
CMSG_SIGNER_CERT_INFO_PARAM, // parameter type
0, // index
pSignerCertInfo, // address for returned information
&cbSignerCertInfo))) // size of the returned information
{
printf("Verify SIGNER_CERT_INFO #2 failed.\n");
exit(1);
}
//-------------------------------------------------------------------
// Open a certificate store in memory using CERT_STORE_PROV_MSG,
// which initializes it with the certificates from the message.
hStoreHandle = CertOpenStore(
CERT_STORE_PROV_MSG, // store provider type
MY_ENCODING_TYPE, // encoding type
NULL, // cryptographic provider
// use NULL for the default
0, // flags
hMsg)); // handle to the message
if (hStoreHandle)
{
printf("The certificate store to be used for message\n ");
printf(" verification has been opened. \n");
}
else
{
printf("Verify open store failed.\n");
exit(1);
}
//-------------------------------------------------------------------
// Find the signer's certificate in the store.
pSignerCertContext = CertGetSubjectCertificateFromStore(
hStoreHandle, // handle to store
MY_ENCODING_TYPE, // encoding type
pSignerCertInfo)); // pointer to retrieved CERT_CONTEXT
if(pSignerCertContext)
{
//-------------------------------------------------------------------
// Use the certificate retrieved from the message. For some
// processing that can be done with the certificate, see the full
// program.
}
//-------------------------------------------------------------------
// Clean up.
if(pSignerCertInfo)
free(pSignerCertInfo);
if(pSignerCertContext)
CertFreeCertificateContext(pSignerCertContext);
if(hStoreHandle)
CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_FORCE_FLAG);
if(hMsg)
CryptMsgClose(hMsg);
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows XP [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | wincrypt.h |
Bibliothek | Crypt32.lib |
DLL | Crypt32.dll |
Weitere Informationen
CertDuplicateCertificateContext