Función CertGetCertificateChain (wincrypt.h)
La función CertGetCertificateChain de
Sintaxis
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
);
Parámetros
[in, optional] hChainEngine
Identificador del motor de cadena (espacio de nombres y caché) que se va a usar. Si hChainEngine es NULL
, se usa el motor de cadena predeterminado, HCCE_CURRENT_USER
, . Este parámetro se puede establecer en HCCE_LOCAL_MACHINE
.
[in] pCertContext
Puntero al CERT_CONTEXT del certificado final, el certificado para el que se compila una cadena. Este contexto de certificado será el elemento de índice cero de la primera cadena simple.
[in, optional] pTime
Puntero a una variable FILETIME que indica la hora para la que se va a validar la cadena. Tenga en cuenta que el tiempo no afecta a la comprobación de la lista de confianza, la revocación o el almacén raíz. La hora actual del sistema se usa si NULL se pasa a este parámetro. La confianza en un certificado determinado que es una raíz de confianza se basa en el estado actual del almacén raíz y no en el estado del almacén raíz en un momento pasado por este parámetro. Para la revocación, una lista de revocación de certificados (CRL), en sí misma, debe ser válida en el momento actual. El valor de este parámetro se usa para determinar si se ha revocado un certificado enumerado en una CRL.
[in] hAdditionalStore
Identificador de cualquier almacén adicional para buscar certificados auxiliares y listas de confianza de certificados de (CTL). Este parámetro puede ser NULL
si no se va a buscar ningún almacén adicional.
[in] pChainPara
Puntero a una estructura de CERT_CHAIN_PARA que incluye parámetros de creación de cadenas.
[in] dwFlags
Marca los valores que indican el procesamiento especial. Este parámetro puede ser una combinación de una o varias de las marcas siguientes.
Valor | Significado |
---|---|
CERT_CHAIN_CACHE_END_CERT0x00000001 |
Cuando se establece esta marca, el certificado final se almacena en caché, lo que puede acelerar el proceso de creación de cadenas. De forma predeterminada, el certificado final no se almacena en caché y tendría que comprobarse cada vez que se compila una cadena para él. |
CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY0x80000000 |
La comprobación de revocación solo tiene acceso a las direcciones URL almacenadas en caché. Esto impediría la recuperación de red de CRL o OCSP para los certificados de entidad de certificación finales o de ca. CACHE_ONLY depende de un compañero de la máquina para que ya haya recuperado la CRL o OCSP de la red. |
CERT_CHAIN_REVOCATION_CHECK_OCSP_CERT0x04000000 |
Esta marca se usa internamente durante la creación de cadenas para un certificado de firma de protocolo de estado de certificado en línea (OCSP) para evitar comprobaciones de revocación cíclicas. Durante la creación de la cadena, si la respuesta OCSP está firmada por un firmante de OCSP independiente, además de la compilación de la cadena original, hay una segunda cadena creada para el propio certificado del firmante OCSP. Esta marca se usa durante esta segunda compilación de cadena para impedir un certificado de firmante OCSP independiente recursivo. Si el certificado de firmante contiene la extensión szOID_PKIX_OCSP_NOCHECK, se omite la comprobación de revocación para el certificado del firmante hoja. Se permiten la comprobación de OCSP y CRL. Windows Server 2003 y Windows XP: Este valor no se admite. |
CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL0x00000004 |
Usa solo direcciones URL almacenadas en caché en la creación de una cadena de certificados. Internet e intranet no se buscan objetos basados en direcciones URL, como taxis de CTL, raíces de terceros y emisores de AIA. La mayoría de las raíces deben estar en un recurso de crypt32.dll. Si no es así, esta recuperación es necesaria para evitar un error de creación de cadena. Estos taxis y raíces se hospedan en servidores de Microsoft CDN de alto rendimiento. Nota: Esta marca no es aplicable a la comprobación de revocación. Establezca CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY para usar solo direcciones URL almacenadas en caché para la comprobación de revocación. Normalmente, los taxis CTL ya se capturan previamente a través del servicio cryptsvc. |
CERT_CHAIN_DISABLE_PASS1_QUALITY_FILTERING0x00000040 |
Por motivos de rendimiento, el segundo paso de creación de cadena solo considera posibles rutas de cadena que tienen una calidad mayor o igual que la más alta determinada durante el primer paso. El primer paso solo tiene en cuenta la firma válida, la cadena completa y las raíces de confianza para calcular la calidad de la cadena. Esta marca se puede establecer para deshabilitar esta optimización y tener en cuenta todas las posibles rutas de acceso de cadena durante el segundo paso. |
CERT_CHAIN_DISABLE_MY_PEER_TRUST0x00000800 |
Esta marca no se admite. Los certificados del almacén "Mi" nunca se consideran para la confianza del mismo nivel. |
CERT_CHAIN_ENABLE_PEER_TRUST0x00000400 |
Los certificados de entidad final del almacén "TrustedPeople" son de confianza sin realizar ninguna creación de cadena. Esta función no establece los bits de miembro CERT_TRUST_IS_PARTIAL_CHAIN ni CERT_TRUST_IS_UNTRUSTED_ROOTdwErrorStatus del parámetro ppChainContext. Windows Server 2003 y Windows XP: Esta marca no se admite. |
CERT_CHAIN_OPT_IN_WEAK_SIGNATURE0x00010000 |
Establecer esta marca indica que el autor de la llamada desea participar en comprobaciones de firma débiles. Esta marca está disponible en la actualización de acumulación para cada sistema operativo a partir de Windows 7 y Windows Server 2008 R2. |
CERT_CHAIN_RETURN_LOWER_QUALITY_CONTEXTS0x00000080 |
El valor predeterminado es devolver solo la ruta de acceso de la cadena de calidad más alta. Al establecer esta marca, se devolverán las cadenas de menor calidad. Estos se devuelven en los de |
CERT_CHAIN_DISABLE_AUTH_ROOT_AUTO_UPDATE0x00000100 |
Establecer esta marca impide la actualización automática de raíces de terceros desde windows Update Web Server. |
CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT0x08000000 |
Al establecer CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT y también se especifica un valor para el dwUrlRetrievalTimeout miembro de la estructura de CERT_CHAIN_PARA, el valor especificado en dwUrlRetrievalTimeout representa el tiempo de espera acumulado en todas las recuperaciones de direcciones URL de revocación. Si establece CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT pero no especifica un valor de dwUrlRetrievalTimeout, el tiempo de espera acumulado máximo se establece, de forma predeterminada, en 20 segundos. Cada dirección URL probada expirará después de que se haya superado la mitad del saldo acumulado restante. Es decir, la primera dirección URL agota el tiempo de espera después de 10 segundos, el segundo después de 5 segundos, el tercero después de 2,5 segundos y así sucesivamente hasta que una dirección URL se realiza correctamente, 20 segundos o no hay más direcciones URL para probar. Si no establece CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT, a cada dirección URL de revocación de la cadena se le asigna un tiempo de espera máximo igual al valor especificado en dwUrlRetrievalTimeout. Si no especifica un valor para el miembro de dwUrlRetrievalTimeout, a cada dirección URL de revocación se le asigna un tiempo de espera predeterminado máximo de 15 segundos. Si ninguna dirección URL se realiza correctamente, el valor máximo de tiempo de espera acumulado es de 15 segundos multiplicado por el número de direcciones URL de la cadena. Puede establecer los valores predeterminados mediante la directiva de grupo. |
CERT_CHAIN_TIMESTAMP_TIME0x00000200 |
Cuando se establece esta marca, pTime se usa como la hora de marca de tiempo para determinar si el certificado final era válido. La hora actual también se puede usar para determinar si el certificado final sigue siendo válido. El resto de entidad de certificación (CA) y certificados raíz de la cadena se comprueban mediante la hora actual y no pTime. |
CERT_CHAIN_DISABLE_AIA0x00002000 |
Al establecer esta marca, se desactivan explícitamente las recuperaciones de Acceso a la información de autoridad (AIA). A veces, los servidores TLS están configurados incorrectamente y no incluyen los certificados de CA correctos en el protocolo de enlace. |
También puede establecer las siguientes marcas de revocación, pero solo se puede establecer una marca de este grupo a la vez.
Valor | Significado |
---|---|
CERT_CHAIN_REVOCATION_CHECK_END_CERT0x10000000 |
La comprobación de revocación se realiza en el certificado final y solo el certificado final. |
CERT_CHAIN_REVOCATION_CHECK_CHAIN0x20000000 |
La comprobación de revocación se realiza en todos los certificados de cada cadena. |
CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT0x40000000 |
La comprobación de revocación se realiza en todos los certificados de todas las cadenas, excepto en el certificado raíz. |
[in] pvReserved
Este parámetro está reservado y debe ser NULL
.
[out] ppChainContext
Dirección de un puntero al contexto de cadena creado. Cuando haya terminado de usar el contexto de la cadena, libere la cadena llamando a la función CertFreeCertificateChain.
Valor devuelto
Si la función se realiza correctamente, la función devuelve un valor distinto de cero (TRUE
).
Si se produce un error en la función, devuelve cero (FALSE
). Para obtener información de error extendida, llame a GetLastError.
Observaciones
Cuando una aplicación solicita una cadena de certificados, la estructura devuelta tiene la forma de un CERT_CHAIN_CONTEXT. Este contexto contiene una matriz de CERT_SIMPLE_CHAIN estructuras en las que cada cadena simple pasa de un certificado final a un certificado autofirmado. El contexto de la cadena conecta cadenas simples a través de listas de confianza. Cada cadena simple contiene la cadena de certificados, información de confianza resumida sobre la cadena e información de confianza sobre cada elemento de certificado de la cadena.
Los siguientes comentarios se aplican a la comprobación de firmas seguras:
- Puede habilitar la comprobación de firmas seguras para esta función estableciendo el miembro pStrongSignPara de la estructura de CERT_CHAIN_PARA a la que apunta el parámetro pChainPara.
- Si se encuentra un certificado sin una firma segura en la cadena, los errores CERT_TRUST_HAS_WEAK_SIGNATURE y CERT_TRUST_IS_NOT_SIGNATURE_VALID se establecen en el campo dwErrorStatus de la estructura CERT_TRUST_STATUS. El parámetro ppChainContext apunta a una estructura de CERT_CHAIN_CONTEXT que, a su vez, apunta a la estructura CERT_TRUST_STATUS.
- Si la cadena tiene una firma segura, se comprueba la clave pública del certificado final para determinar si cumple los requisitos mínimos de longitud de clave pública para una firma segura. Si no se cumple la condición, los errores CERT_TRUST_HAS_WEAK_SIGNATURE y CERT_TRUST_IS_NOT_SIGNATURE_VALID se establecen en el campo dwErrorStatus de la estructura de CERT_TRUST_STATUS. Para deshabilitar la comprobación de la longitud de la clave, establezca el valor de
CERT_CHAIN_STRONG_SIGN_DISABLE_END_CHECK_FLAG en elmiembro dwStrongSignFlags de la estructura deCERT_CHAIN_PARA apuntado por el parámetro pChainPara de. - Si las marcas CERT_STRONG_SIGN_ENABLE_CRL_CHECK o CERT_STRONG_SIGN_ENABLE_OCSP_CHECK se establecen en la estructura de CERT_STRONG_SIGN_SERIALIZED_INFO y se encuentra una respuesta CRL o OCSP sin una firma segura, la respuesta CRL o OCSP se tratará como sin conexión. Es decir, los errores de CERT_TRUST_IS_OFFLINE_REVOCATION y CERT_TRUST_REVOCATION_STATUS_UNKNOWN se establecen en el campo dwErrorStatus de la estructura de CERT_TRUST_STATUS. Además, el miembro dwRevocationResult de la estructura de CERT_REVOCATION_INFO se establece en NTE_BAD_ALGID.
Las siguientes recomendaciones se aplicarían a cualquier aplicación de Windows que llame a estas API para comprobar un certificado de autenticación del servidor TLS:
- Habilitar solo la comprobación de revocación para el certificado final.
- Establezca la marca CERT_CHAIN_REVOCATION_CHECK_END_CERT.
- La mayoría de los certificados de ENTIDAD de certificación tienen CRL con una validez de tiempo de 1 a 6 meses.
- Puesto que las CRL descargadas se almacenan en caché, esta validez es demasiado larga para tener mucho valor.
- Si hay un riesgo de entidad de certificación, los certificados también se agregarían al CTL no permitido de Windows.
- La práctica recomendada para los servidores TLS es admitir la asociación OCSP para el certificado final.
- En ese caso, no se necesitará ninguna recuperación de red a menos que la respuesta OCSP grapada haya expirado.
- Habilite las recuperaciones de red para CRL, OCSP, emisores de AIA y taxis CTL de la plataforma Windows y raíces de terceros.
- Cuando se establece el CERT_CHAIN_REVOCATION_CHECK_END_CERT anterior, este es el valor predeterminado.
- No establezca ninguna de las marcas siguientes para evitar las recuperaciones de red. Consulte la tabla dwFlags anterior para obtener más información sobre estas marcas:
- CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL
- CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY
- CERT_CHAIN_DISABLE_AIA
- Habilite el tiempo de espera acumulado para las recuperaciones de red CRL y OCSP.
- Establezca la marca de CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT pasada a CertGetCertificateChain.
- Proporciona un límite superior en el tiempo total permitido para las recuperaciones de red CRL y OCSP.
- Reduzca el tiempo máximo permitido para cada recuperación de red de 15 a 10 segundos.
- Establezca el campo dwUrlRetrievalTimeout de
en el CERT_CHAIN_PARA pasado aCertGetCertificateChain a 10 * 1000 milisegundos. - Esto también reduce el tiempo de espera acumulado de 20 a 10 segundos.
- Solo se deben descargar las respuestas OCSP para los certificados finales. 5 segundos debe ser suficiente para esa descarga.
- Establezca el campo dwUrlRetrievalTimeout de
- Omitir los errores de revocación sin conexión.
- Establezca CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS en el CERT_CHAIN_POLICY_PARA pasado a CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL).
- La recuperación de red de OCSP y CRL es el mejor intento. La mayoría de las recuperaciones de red deben realizarse correctamente en un par de segundos, pero no es 100% garantizado.
- Información de validación de certificados finales de caché.
- Establezca el CERT_CHAIN_CACHE_END_CERT.
- Habilita el almacenamiento en caché de LRU de información sobre los certificados finales además de los certificados intermedios.
- Es habitual realizar varias conexiones TLS al mismo servidor.
- Establezca el CERT_CHAIN_CACHE_END_CERT.
Ejemplos
Para obtener un ejemplo que usa esta función, vea Programa C de ejemplo: Crear una cadena de certificados.
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows XP [aplicaciones de escritorio | Aplicaciones para UWP] |
servidor mínimo admitido | Windows Server 2003 [aplicaciones de escritorio | Aplicaciones para UWP] |
de la plataforma de destino de |
Windows |
encabezado de |
wincrypt.h |
biblioteca de |
Crypt32.lib |
DLL de |
Crypt32.dll |