管理证书存储状态

有多个函数提供用于管理证书存储状态的服务。

若要获取对证书的访问权限,必须通过调用 CertOpenStore 或 CertOpenSystemStore 来打开存储证书的证书存储

通常,证书存储区在缓存的内存中打开。 它可以是新存储,也可以从本地注册表、远程计算机上的注册表、磁盘文件、PKCS #7 消息或其他源加载其内容。

CryptoAPI 证书存储函数还允许存储区在缓存内存之外维护证书,例如证书的外部数据库,例如 Microsoft 证书服务器数据库提供的数据库。

CertOpenStore 函数的一个参数 lpszStoreProvider 确定打开的存储类型和用于打开该存储的提供程序。 有关使用各种提供程序打开证书存储的示例,请参阅用于打开证书存储的 C 代码示例

CertCloseStore 关闭证书存储。 关闭证书存储后,该存储中的每个证书上下文的引用计数都会减少一个。 为引用计数为零的证书释放内存。

使用 CertCloseStore 设置 CERT_CLOSE_STORE_FORCE_FLAG 会关闭证书存储,并释放其所有证书上下文的内存,而不考虑其引用计数。 在某些情况下,例如在多线程程序中,这不可取。 如果设置了 CERT_CLOSE_STORE_CHECK_FLAG,存储会被关闭,但如果仍为引用计数未减少为零的证书分配内存,函数将返回警告值。 如果证书的引用计数大于零,则该证书上下文的副本尚未释放。 使用 CertFreeCertificateContextCertFreeCRLContext 和 CertFreeCTLContext 释放所有保持打开状态的证书。

注意

证书上下文是一个 CERT_CONTEXT 类型的结构,其中包含指向编码证书 BLOB 的指针和指向 CERT_INFO 结构的指针。 CERT_INFO 结构包含最重要的证书数据。 有关证书、证书吊销列表 (CRL) 和证书信任列表 (CTL) 上下文结构的详细信息,请参阅编码和解码证书上下文

每个证书上下文还包含一个引用计数,表明已分配的上下文地址的副本数。 每次以任何方式复制证书上下文时,其引用计数都会递增一个。 每次释放指向证书上下文的指针时,证书上下文中的引用计数都会递减一个。 当证书上下文上的引用计数达到零时,保留上下文的内存将被取消分配。 当该上下文位于存储中并且使用 CERT_CLOSE_STORE_FORCE_FLAG 关闭存储区时,为证书上下文分配的内存也会被取消分配。 如果某个上下文的内存被取消分配,并且指向该上下文的指针仍在使用中,则这些指针不再有效。

 

CertDuplicateStore 会增加 存储中的引用计数

CertSaveStore 将存储的内容保存到磁盘文件或内存位置,以及

CertControlStore 在存储打开时对其进行管理。 当该存储的持久状态被一些其他进程更改时,具有开放存储的应用程序就会收到通知。 如果从域控制计算机将新证书复制到本地计算机存储区,则可能会发生这种情况。

发现更改后,缓存存储可以重新同步其缓存存储,以匹配存储的持久状态。 CertControlStore 还支持一个进程,当缓存存储中的这些更改不会自动保存时,该进程会将缓存的存储更改复制到永久存储。

类似于证书存储的证书上下文可以具有扩展属性。 CertSetStoreProperty 将扩展属性添加到证书存储。 CertGetStoreProperty 检索证书存储上设置的任何属性。 目前,唯一的预定义证书存储属性是存储的本地化名称。