Administración de un estado del almacén de certificados
Varias funciones proporcionan servicios para administrar un estado de almacén de certificados.
Para obtener acceso a los certificados, el almacén de certificados en el que se almacenan debe abrirse a través de una llamada a CertOpenStore o CertOpenSystemStore.
Normalmente, un almacén de certificados se abre en memoria caché. Puede ser un nuevo almacén o su contenido se puede cargar desde el registro local, el registro en un equipo remoto, un archivo de disco, un mensaje PKCS #7 o algún otro origen.
Las funciones de almacén de certificados de CryptoAPI también permiten a un almacén mantener certificados fuera de la memoria almacenada en caché en, por ejemplo, una base de datos externa de certificados, como la proporcionada por la base de datos de Microsoft Certificate Server.
Uno de los parámetros de la función CertOpenStore, lpszStoreProvider, determina el tipo de almacén abierto y el proveedor que se usa para abrir ese almacén. Para obtener ejemplos de apertura de almacenes de certificados mediante varios proveedores, consulte Código C de ejemplo para abrir almacenes de certificados.
CertCloseStore cierra un almacén de certificados. Cuando se cierra un almacén de certificados, cada uno de los contextos de certificado de ese almacén ve reducido en uno su recuento de referencias. Se libera memoria para los certificados cuyo recuento de referencias llega a cero.
Establecer CERT_CLOSE_STORE_FORCE_FLAG con CertCloseStore cierra el almacén de certificados y libera memoria para todos sus contextos de certificado independientemente de su recuento de referencias. En algunos casos, como en programas multiproceso, esto no puede ser deseable. Si se establece CERT_CLOSE_STORE_CHECK_FLAG, el almacén se cierra, pero la función devuelve un valor de advertencia si la memoria todavía está asignada para los certificados cuyos recuentos de referencia no se han reducido a cero. Si el recuento de referencias de un certificado es mayor que cero, no se ha liberado un duplicado de ese contexto de certificado. Use CertFreeCertificateContext, CertFreeCRLContext y CertFreeCTLContext para liberar los certificados abiertos.
Nota:
Un contexto de certificado es una estructura de tipo CERT_CONTEXT que tiene, entre otros miembros, un puntero al BLOB de certificado codificado y un puntero a una estructura CERT_INFO. La estructura CERT_INFO contiene los datos de certificado más significativos. Para obtener más información sobre las estructuras de contexto de certificado, lista de revocación de certificados (CRL) y lista de certificados de confianza (CTL), consulte Codificación y descodificación de un contexto de certificado.
Cada contexto de certificado también contiene un recuento de referencias que indica el número de copias de la dirección del contexto que se han asignado. Cada vez que se duplica un contexto de certificado de cualquier manera, su recuento de referencias se incrementa en uno. Cada vez que se libera un puntero a un contexto de certificado, el recuento de referencias en el contexto del certificado disminuye en uno. Cuando el recuento de referencias de un contexto de certificado alcanza cero, la memoria que contiene el contexto se desasigna. La memoria asignada para un contexto de certificado también se desasigna cuando ese contexto está en un almacén y el almacén se cierra mediante CERT_CLOSE_STORE_FORCE_FLAG. Si la memoria de un contexto se desasigna y los punteros a ese contexto todavía están en uso, esos punteros ya no son válidos.
CertDuplicateStore aumenta el recuento de referencias en el almacén.
CertSaveStore guarda el contenido de un almacén en un archivo de disco o en una ubicación de memoria, y
CertControlStore administra un almacén mientras está abierto. Se puede notificar a una aplicación con un almacén abierto cuando el estado persistente de ese almacén ha cambiado por algún otro proceso. Esto podría ocurrir si se copiaron nuevos certificados en el almacén de equipos locales desde un equipo de control de dominio.
Cuando se detectan cambios, el almacén almacenado en caché puede volver a sincronizar su almacén almacenado en caché para que coincida con el estado persistente del almacén. CertControlStore también admite un proceso que copia los cambios del almacén almacenado en caché en el almacenamiento permanente cuando estos cambios en el almacén almacenado en caché no se guardan automáticamente.
Los contextos de certificado similares al almacén de certificados pueden tener propiedades extendidas. CertSetStoreProperty agrega propiedades extendidas a un almacén de certificados. CertGetStoreProperty recupera las propiedades establecidas en un almacén de certificados. Actualmente, la única propiedad de almacén de certificados predefinida es el nombre localizado de un almacén.