Funzione CertGetSubjectCertificateFromStore (wincrypt.h)
La funzione CertGetSubjectCertificateFromStore restituisce da un archivio certificati un contesto di certificato soggetto identificato in modo univoco dal relativo numero emittente e seriale.
Sintassi
PCCERT_CONTEXT CertGetSubjectCertificateFromStore(
[in] HCERTSTORE hCertStore,
[in] DWORD dwCertEncodingType,
[in] PCERT_INFO pCertId
);
Parametri
[in] hCertStore
Handle di un archivio certificati.
[in] dwCertEncodingType
Tipo di codifica utilizzata. È sempre accettabile specificare sia i tipi di codifica del certificato che dei messaggi combinandoli con un'operazione bit per bit or , come illustrato nell'esempio seguente:
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING Tipi di codifica attualmente definiti sono:
- X509_ASN_ENCODING
- PKCS_7_ASN_ENCODING
[in] pCertId
Puntatore a una struttura CERT_INFO . Vengono usati solo i membri Emittente e SerialNumber .
Valore restituito
Se la funzione ha esito positivo, la funzione restituisce un puntatore a un CERT_CONTEXT di sola lettura. Il CERT_CONTEXT deve essere liberato chiamando CertFreeCertificateContext.
Il certificato restituito potrebbe non essere valido. In genere, viene verificato quando viene ottenuto il certificato dell'autorità di certificazione (CertGetIssuerCertificateFromStore).
Per informazioni sull'errore estese, chiamare GetLastError. Un possibile codice di errore è il seguente.
Codice restituito | Descrizione |
---|---|
|
Il certificato soggetto non è stato trovato nell'archivio. |
Commenti
CertDuplicateCertificateContext può essere chiamato per creare un certificato duplicato.
Esempio
Nell'esempio seguente viene illustrato il recupero del contesto di certificato di un soggetto, identificato in modo univoco dal relativo numero di autorità emittente e seriale, dall'archivio certificati. Per un esempio che include il contesto completo per questo esempio, vedere Esempio di programma C: firma, codifica, decodifica e verifica di un messaggio.
#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);
}
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows XP [app desktop | App UWP] |
Server minimo supportato | Windows Server 2003 [app desktop | App UWP] |
Piattaforma di destinazione | Windows |
Intestazione | wincrypt.h |
Libreria | Crypt32.lib |
DLL | Crypt32.dll |
Vedi anche
CertDuplicateCertificateContext