Gerenciando um estado de repositório de certificados
Várias funções fornecem serviços para gerenciar um estado de repositório de certificados .
Para obter acesso aos certificados, o repositório de certificados no qual eles estão armazenados deve ser aberto por meio de uma chamada para CertOpenStore ou CertOpenSystemStore.
Normalmente, um repositório de certificados é aberto na memória armazenada em cache. Pode ser um novo armazenamento ou seu conteúdo pode ser carregado do registro local, do registro em um computador remoto, de um arquivo de disco, de uma mensagem PKCS #7 ou de alguma outra fonte.
As funções de armazenamento de certificados CryptoAPI também permitem que um repositório mantenha certificados fora da memória armazenada em cache em, por exemplo, um banco de dados externo de certificados, como o fornecido pelo Banco de Dados do Servidor de Certificados da Microsoft.
Um dos parâmetros da função CertOpenStore , lpszStoreProvider, determina o tipo de repositório aberto e o provedor usado para abrir esse repositório. Para obter exemplos de abertura de repositórios de certificados usando vários provedores, consulte Exemplo de código C para abrir repositórios de certificados.
CertCloseStore fecha um repositório de certificados. Quando um repositório de certificados é fechado, cada um dos contextos de certificado nesse repositório tem sua contagem de referência reduzida em um. A memória é liberada para certificados cuja contagem de referência vai para zero.
Definir CERT_CLOSE_STORE_FORCE_FLAG com CertCloseStore fecha o repositório de certificados e libera memória para todos os seus contextos de certificado, independentemente de sua contagem de referência. Em alguns casos, como em programas multithread, isso não pode ser desejável. Se CERT_CLOSE_STORE_CHECK_FLAG for definido, o repositório será fechado, mas um valor de aviso será retornado pela função se a memória ainda estiver alocada para certificados cujas contagens de referência não foram reduzidas a zero. Se a contagem de referência de um certificado for maior que zero, uma duplicata desse contexto de certificado não foi liberada. Use CertFreeCertificateContext, CertFreeCRLContext e CertFreeCTLContext para liberar todos os certificados deixados abertos.
Observação
Um contexto de certificado é uma estrutura do tipo CERT_CONTEXT que tem, entre outros membros, um ponteiro para o BLOB do certificado codificado e um ponteiro para uma estrutura CERT_INFO. A estrutura CERT_INFO contém os dados de certificado mais significativos. Para obter mais informações sobre estruturas de contexto de certificado, CRL (lista de certificados revogados) e CTL (lista de certificados confiáveis), consulte Codificando e decodificando um contexto de certificado.
Cada contexto de certificado também contém uma contagem de referência que indica o número de cópias do endereço do contexto que foram atribuídas. Cada vez que um contexto de certificado é duplicado de alguma forma, sua contagem de referência é incrementada em um. Cada vez que um ponteiro para um contexto de certificado é liberado, a contagem de referência no contexto do certificado é diminuída em um. Quando a contagem de referência em um contexto de certificado atinge zero, a memória que contém o contexto é desalocada. A memória alocada para um contexto de certificado também é desalocada quando esse contexto está em um repositório e o repositório é fechado usando CERT_CLOSE_STORE_FORCE_FLAG. Se a memória de um contexto for desalocada e os ponteiros para esse contexto ainda estiverem em uso, esses ponteiros não serão mais válidos.
CertDuplicateStore aumenta a contagem de referência no repositório.
CertSaveStore salva o conteúdo de um repositório em um arquivo de disco ou em um local de memória e
CertControlStore gerencia um repositório enquanto ele está aberto. Um aplicativo com um repositório aberto pode ser notificado quando o estado persistente desse repositório for alterado por algum outro processo. Isso pode acontecer se novos certificados forem copiados para o repositório de computadores local de um computador de controle de domínio.
Quando as alterações são descobertas, o repositório armazenado em cache pode sincronizar novamente seu repositório armazenado em cache para corresponder ao estado persistente do repositório. O CertControlStore também dá suporte a um processo que copia as alterações do repositório armazenado em cache para o armazenamento permanente quando essas alterações no repositório armazenado em cache não são salvas automaticamente.
Contextos de certificado semelhantes ao repositório de certificados podem ter propriedades estendidas. CertSetStoreProperty adiciona propriedades estendidas a um repositório de certificados. CertGetStoreProperty recupera todas as propriedades definidas em um repositório de certificados. Atualmente, a única propriedade predefinida do repositório de certificados é o nome localizado de um repositório.