Funzione CertGetCertificateChain (wincrypt.h)
La funzione CertGetCertificateChain
Sintassi
BOOL CertGetCertificateChain(
[in, optional] HCERTCHAINENGINE hChainEngine,
[in] PCCERT_CONTEXT pCertContext,
[in, optional] LPFILETIME pTime,
[in] HCERTSTORE hAdditionalStore,
[in] PCERT_CHAIN_PARA pChainPara,
[in] DWORD dwFlags,
[in] LPVOID pvReserved,
[out] PCCERT_CHAIN_CONTEXT *ppChainContext
);
Parametri
[in, optional] hChainEngine
Handle del motore della catena (spazio dei nomi e cache) da usare. Se hChainEngine è NULL
, viene usato il motore della catena predefinito HCCE_CURRENT_USER
. Questo parametro può essere impostato su HCCE_LOCAL_MACHINE
.
[in] pCertContext
Puntatore al CERT_CONTEXT del certificato finale, certificato per il quale viene compilata una catena. Questo contesto di certificato sarà l'elemento zero-index nella prima catena semplice.
[in, optional] pTime
Puntatore a una variabile FILETIME
[in] hAdditionalStore
Handle per qualsiasi archivio aggiuntivo in cui cercare i certificati di supporto e elenchi di attendibilità dei certificati (CCL). Questo parametro può essere NULL
se non è necessario eseguire ricerche in un archivio aggiuntivo.
[in] pChainPara
Puntatore a una struttura di CERT_CHAIN_PARA che include parametri di compilazione della catena.
[in] dwFlags
Contrassegna i valori che indicano un'elaborazione speciale. Questo parametro può essere una combinazione di uno o più dei flag seguenti.
Valore | Significato |
---|---|
CERT_CHAIN_CACHE_END_CERT0x00000001 |
Quando questo flag è impostato, il certificato finale viene memorizzato nella cache, che potrebbe velocizzare il processo di compilazione della catena. Per impostazione predefinita, il certificato finale non viene memorizzato nella cache e deve essere verificato ogni volta che viene compilata una catena. |
CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY0x80000000 |
Il controllo delle revoche accede solo agli URL memorizzati nella cache. In questo modo si impedisce il recupero di rete di CRL o OCSP per i certificati end o CA. CACHE_ONLY dipende da un amico del computer per aver già recuperato il CRL o OCSP dalla rete. |
CERT_CHAIN_REVOCATION_CHECK_OCSP_CERT0x04000000 |
Questo flag viene usato internamente durante la compilazione della catena per un certificato (OCSP) del protocollo di stato del certificato online Windows Server 2003 e Windows XP: Questo valore non è supportato. |
CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL0x00000004 |
Usa solo gli URL memorizzati nella cache nella compilazione di una catena di certificati. Internet e Intranet non vengono cercati oggetti basati su URL, ad esempio cab CTL, radici di terze parti e autorità emittenti AIA. La maggior parte delle radici deve trovarsi in una risorsa crypt32.dll. In caso contrario, questo recupero è necessario per evitare un errore di compilazione della catena. Questi cab e radici sono ospitati su server CDN Microsoft ad alte prestazioni. Nota: Questo flag non è applicabile al controllo delle revoche. Impostare CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY per usare solo gli URL memorizzati nella cache per il controllo delle revoche. Normalmente, i cab CTL sono già prelettura tramite il servizio cryptsvc. |
CERT_CHAIN_DISABLE_PASS1_QUALITY_FILTERING0x00000040 |
Per motivi di prestazioni, il secondo passaggio di compilazione della catena considera solo i possibili percorsi di catena con qualità maggiore o uguale alla massima qualità determinata durante il primo passaggio. Il primo passaggio considera solo la firma valida, la catena completa e le radici attendibili per calcolare la qualità della catena. Questo flag può essere impostato per disabilitare questa ottimizzazione e prendere in considerazione tutti i possibili percorsi di catena durante il secondo passaggio. |
CERT_CHAIN_DISABLE_MY_PEER_TRUST0x00000800 |
Questo flag non è supportato. I certificati nell'archivio "My" non vengono mai considerati per l'attendibilità peer. |
CERT_CHAIN_ENABLE_PEER_TRUST0x00000400 |
I certificati di entità finali nell'archivio "TrustedPeople" sono attendibili senza eseguire alcuna compilazione della catena. Questa funzione non imposta il CERT_TRUST_IS_PARTIAL_CHAIN o CERT_TRUST_IS_UNTRUSTED_ROOTbit del membro dwErrorStatus del parametro ppChainContext. Windows Server 2003 e Windows XP: Questo flag non è supportato. |
CERT_CHAIN_OPT_IN_WEAK_SIGNATURE0x00010000 |
L'impostazione di questo flag indica che il chiamante desidera acconsentire esplicitamente a controlli di firma deboli. Questo flag è disponibile nell'aggiornamento cumulativo per ogni sistema operativo a partire da Windows 7 e Windows Server 2008 R2. |
CERT_CHAIN_RETURN_LOWER_QUALITY_CONTEXTS0x00000080 |
L'impostazione predefinita consiste nel restituire solo il percorso della catena di qualità più alta. L'impostazione di questo flag restituirà le catene di qualità inferiori. Questi vengono restituiti nei |
CERT_CHAIN_DISABLE_AUTH_ROOT_AUTO_UPDATE0x00000100 |
L'impostazione di questo flag impedisce l'aggiornamento automatico delle radici di terze parti dal server Web di Windows Update. |
CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT0x08000000 |
Quando si imposta CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT e si specifica anche un valore per il dwUrlRetrievalTimeout membro della struttura CERT_CHAIN_PARA, il valore specificato in dwUrlRetrievalTimeout rappresenta il timeout cumulativo in tutti i recupero url di revoca. Se si imposta CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT ma non si specifica un valore dwUrlRetrievalTimeout, per impostazione predefinita viene impostato il timeout cumulativo massimo su 20 secondi. Ogni URL testato eseguirà il timeout dopo il superamento della metà del saldo cumulativo rimanente. Vale a dire, il primo URL si verifica dopo 10 secondi, il secondo dopo 5 secondi, il terzo dopo 2,5 secondi e così via fino a quando non viene completato un URL, 20 secondi o non sono presenti altri URL da testare. Se non si imposta CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT, a ogni URL di revoca nella catena viene assegnato un timeout massimo uguale al valore specificato in dwUrlRetrievalTimeout. Se non si specifica un valore per il membro dwUrlRetrievalTimeout, a ogni URL di revoca viene assegnato un timeout predefinito massimo di 15 secondi. Se nessun URL ha esito positivo, il valore di timeout cumulativo massimo è di 15 secondi moltiplicato per il numero di URL nella catena. È possibile impostare i valori predefiniti usando Criteri di gruppo. |
CERT_CHAIN_TIMESTAMP_TIME0x00000200 |
Quando questo flag è impostato, pTime viene usato come timestamp per determinare se il certificato finale è stato valido. L'ora corrente può essere usata anche per determinare se il certificato finale rimane valido. Tutte le altre autorità di certificazione (CA) e i certificati radice nella catena vengono controllati usando l'ora corrente e non pTime . |
CERT_CHAIN_DISABLE_AIA0x00002000 |
L'impostazione di questo flag disattiva in modo esplicito i recupero dell'accesso alle informazioni sull'autorità (AIA). A volte i server TLS non sono configurati correttamente e non includono i certificati CA corretti nell'handshake. |
È anche possibile impostare i flag di revoca seguenti, ma è possibile impostare un solo flag di questo gruppo alla volta.
Valore | Significato |
---|---|
CERT_CHAIN_REVOCATION_CHECK_END_CERT0x10000000 |
Il controllo delle revoche viene eseguito sul certificato finale e solo sul certificato finale. |
CERT_CHAIN_REVOCATION_CHECK_CHAIN0x20000000 |
Il controllo delle revoche viene eseguito su tutti i certificati in ogni catena. |
CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT0x40000000 |
Il controllo delle revoche viene eseguito su tutti i certificati in tutte le catene, ad eccezione del certificato radice. |
[in] pvReserved
Questo parametro è riservato e deve essere NULL
.
[out] ppChainContext
Indirizzo di un puntatore al contesto della catena creato. Al termine dell'uso del contesto della catena, rilasciare la catena chiamando la funzione CertFreeCertificateChain
Valore restituito
Se la funzione ha esito positivo, la funzione restituisce un valore diverso da zero (TRUE
).
Se la funzione ha esito negativo, restituisce zero (FALSE
). Per informazioni sugli errori estesi, chiamare GetLastError.
Osservazioni
Quando un'applicazione richiede una catena di certificati, la struttura restituita è sotto forma di CERT_CHAIN_CONTEXT. Questo contesto contiene una matrice di strutture CERT_SIMPLE_CHAIN in cui ogni catena semplice passa da un certificato finale a un certificato autofirmato. Il contesto della catena connette catene semplici tramite elenchi di attendibilità. Ogni catena semplice contiene la catena di certificati, informazioni di attendibilità di riepilogo sulla catena e informazioni di attendibilità su ogni elemento certificato nella catena.
Le osservazioni seguenti si applicano al controllo della firma avanzata:
- È possibile abilitare il controllo delle firme complesse per questa funzione impostando il membro
pStrongSignPara della struttura CERT_CHAIN_PARA a cui punta il parametropChainPara . - Se nella catena viene trovato un certificato senza firma complessa, gli errori di CERT_TRUST_HAS_WEAK_SIGNATURE e CERT_TRUST_IS_NOT_SIGNATURE_VALID vengono impostati nel campo dwErrorStatus della struttura CERT_TRUST_STATUS. Il parametro ppChainContext punta a una struttura CERT_CHAIN_CONTEXT che, a sua volta, punta alla struttura CERT_TRUST_STATUS.
- Se la catena è firmata con firma avanzata, viene verificata la chiave pubblica nel certificato finale per determinare se soddisfa i requisiti minimi di lunghezza della chiave pubblica per una firma complessa. Se la condizione non viene soddisfatta, i
CERT_TRUST_HAS_WEAK_SIGNATURE e gli errori diCERT_TRUST_IS_NOT_SIGNATURE_VALID vengono impostati nel campo dwErrorStatusdella struttura CERT_TRUST_STATUS . Per disabilitare il controllo della lunghezza della chiave, impostare il valore CERT_CHAIN_STRONG_SIGN_DISABLE_END_CHECK_FLAG nel dwStrongSignFlags membro della struttura CERT_CHAIN_PARA a cui punta il parametro pChainPara. - Se i flag CERT_STRONG_SIGN_ENABLE_CRL_CHECK o CERT_STRONG_SIGN_ENABLE_OCSP_CHECK vengono impostati nella struttura CERT_STRONG_SIGN_SERIALIZED_INFO e viene trovata una risposta CRL o OCSP senza firma avanzata, la risposta CRL o OCSP verrà considerata offline. Ovvero, gli errori di
CERT_TRUST_IS_OFFLINE_REVOCATION eCERT_TRUST_REVOCATION_STATUS_UNKNOWN vengono impostati nel campo dwErrorStatusdella struttura CERT_TRUST_STATUS . Inoltre, il membro dwRevocationResultdella struttura CERT_REVOCATION_INFO è impostato suNTE_BAD_ALGID .
Le raccomandazioni seguenti si applicano a qualsiasi applicazione Windows che chiama queste API per verificare un certificato di autenticazione del server TLS:
- Abilitare solo il controllo delle revoche per il certificato finale.
- Impostare CERT_CHAIN_REVOCATION_CHECK_END_CERT flag.
- La maggior parte dei certificati DELLA CA ha una validità di tempo da 1 a 6 mesi.
- Poiché i CRL scaricati vengono memorizzati nella cache, questa validità è troppo lunga per avere molto valore.
- In caso di compromissione della CA, anche i certificati verrebbero aggiunti al CTL non consentito di Windows
- La procedura consigliata per i server TLS consiste nel supportare l'associazione OCSP per il certificato finale.
- In tal caso, non sarà necessario alcun recupero di rete, a meno che la risposta OCSP graffata sia scaduta.
- Abilitare il recupero di rete per CTL, OCSP, autorità emittenti AIA e cab CTL della piattaforma Windows e radici di terze parti.
- Quando il CERT_CHAIN_REVOCATION_CHECK_END_CERT precedente è impostato, si tratta dell'impostazione predefinita.
- Non impostare alcuno dei flag seguenti per impedire il recupero di rete. Per altre informazioni su questi flag, vedere la tabella dwFlags
precedente: - CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL
- CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY
- CERT_CHAIN_DISABLE_AIA
- Abilitare il timeout cumulativo per il recupero di rete CRL e OCSP.
- Impostare il flag di CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT passato a CertGetCertificateChain.
- Fornisce un limite massimo per il tempo totale consentito per il recupero di rete CRL e OCSP.
- Ridurre il tempo massimo consentito per ogni recupero di rete da 15 a 10 secondi.
- Impostare il campo dwUrlRetrievalTimeout
nel CERT_CHAIN_PARA passato aCertGetCertificateChain su 10 * 1000 millisecondi. - Ciò riduce anche il timeout accumulativo da 20 a 10 secondi.
- Solo le risposte OCSP devono essere scaricate per i certificati finali. 5 secondi devono essere sufficienti per il download.
- Impostare il campo dwUrlRetrievalTimeout
- Ignorare gli errori di revoca offline.
- Impostare CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS nel CERT_CHAIN_POLICY_PARA passato a CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL).
- Il recupero di rete di OCSP e CRL è il tentativo migliore. La maggior parte dei recupero di rete dovrebbe avere esito positivo in un paio di secondi, ma non è garantito 100%.
- Informazioni di convalida del certificato finale della cache.
- Impostare il CERT_CHAIN_CACHE_END_CERT.
- Abilita la memorizzazione nella cache delle informazioni sui certificati finali oltre ai certificati intermedi.
- È comune stabilire più connessioni TLS allo stesso server.
- Impostare il CERT_CHAIN_CACHE_END_CERT.
Esempi
Per un esempio che usa questa funzione, vedere Programma C di esempio: Creazione di una catena di certificati.
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Windows XP [app desktop | App UWP] |
server minimo supportato | Windows Server 2003 [app desktop | App UWP] |
piattaforma di destinazione | Finestre |
intestazione |
wincrypt.h |
libreria |
Crypt32.lib |
dll | Crypt32.dll |