擴充 CertOpenStore 功能

憑證存放區是所有憑證管理作業的核心。 CertOpenStore函式的功能可以透過使用可安裝 (或已註冊) 的憑證存放區提供者函式來擴充。 如需如何安裝或註冊函式以搭配 CryptoAPI 使用的概觀,請參閱 OID 概觀

注意

執行自動化部署時,不會自動移轉自訂憑證存放區。 若要移轉自訂憑證存放區,您必須建立資訊清單來移轉自訂存放區,並使用 Windows 使用者狀態移轉工具 (USMT) 。

 

CertOpenStore會在記憶體中開啟空的存放區,並使用在lpszStoreProvider參數中傳遞的物件識別碼) (OID) ,呼叫存放區提供者函式 ( (。 如需 CryptoAPI 所提供的預先定義提供者類型清單,請參閱 CertOpenStore

存放區提供者函式會將其憑證和 憑證撤銷清單 (CRL) 複製到傳遞給它的 hCertStore 控制碼所指定的記憶體內部存放區。 新的存放區提供者函式可以使用任何 CryptoAPI 憑證存放區函式,例如 CertAddCertificateCoNtextToStoreCertAddSerializedElementToStore,將其憑證和 CRL 新增至記憶體內部存放區。 此外,存放區提供者函式會選擇性地傳回 CERT_STORE_PROV_INFO 結構之所有資料成員的值。 如果函式支援其他回呼函式,則函式只需要更新這個結構。 例如,如果存放區是唯讀存放區,則可能不需要支援其他回呼函式。 如需可能回呼函式的詳細資料和原型,請參閱 憑證存放區提供者回呼函式

每個使用者 TrustedPeople 存放區僅限於預先定義的實體存放區。 您無法擴充每個使用者 TrustedPeople 存放區。 不過,您可以擴充本機電腦 TrustedPeople 存放區。

Windows XP 和 Windows Server 2003: 每個使用者 TrustedPeople 存放區不限於預先定義的實體存放區。

CERT_STORE_PROV_INFO結構的其中一個資料成員是rgpvStoreProvFunc陣列。 如果存放區提供者函式需要支援一或多個回呼函式,則必須提供此陣列的指標。 這些指標必須指向要用於其他憑證存放區活動的回呼函式, (例如關閉存放區) 。 下圖顯示此程式的流程。

certopenstore 功能

如下圖所示,開啟存放區之後,其他 CryptoAPI 函式 (例如 CertCloseStore) 使用指標陣列來存取執行預定工作的回呼函式。 證書存儲提供者回呼函式會顯示CERT_STORE_PROV_INFO結構和預設回呼函式的原型定義,這些函式隨附于 CryptoAPI。

certclosestore 功能

存放區 API 可讓存放區提供者維護憑證、CRL 和 憑證信任清單 , (CTL) 存放區快取之外 (例如,Microsoft Certificate Server Database) 所提供的外部憑證資料庫。

CertOpenStore 會透過 pszStoreProvider 參數分派至適當的 CertDllOpenStoreProv 可安裝提供者函式。 提供者會傳回 pStoreProvInfo 參數中指向 CERT_STORE_PROV_INFO 結構的資訊。 CERT_STORE_PROV_INFO結構包含dwStoreProvFlags成員。 已新增CERT_STORE_PROV_EXTERNAL_FLAG旗標,以允許提供者指出憑證、CRL 和 CTL 位於存放區的快取外部。

CertDllOpenStoreProv 會傳回回回呼函式的陣列。 提供者可以實作下列回呼函式:

  • CERT_STORE_PROV_CLOSE_FUNC
  • CERT_STORE_PROV_READ_CERT_FUNC
  • CERT_STORE_PROV_WRITE_CERT_FUNC
  • CERT_STORE_PROV_DELETE_CERT_FUNC
  • CERT_STORE_PROV_SET_CERT_PROPERTY_FUNC
  • CERT_STORE_PROV_READ_CRL_FUNC
  • CERT_STORE_PROV_WRITE_CRL_FUNC
  • CERT_STORE_PROV_DELETE_CRL_FUNC
  • CERT_STORE_PROV_SET_CRL_PROPERTY_FUNC
  • CERT_STORE_PROV_READ_CTL_FUNC
  • CERT_STORE_PROV_WRITE_CTL_FUNC
  • CERT_STORE_PROV_DELETE_CTL_FUNC
  • CERT_STORE_PROV_SET_CTL_PROPERTY_FUNC

在設定CERT_STORE_PROV_WRITE_ADD_FLAG時呼叫WRITE_CERT、WRITE_CRL和WRITE_CTL回呼函式時, dwFlags 參數的上層 16 位包含 dwAddDisposition 值。 若要支援外部存放區,提供者可以實作下列回呼函式:

  • CERT_STORE_PROV_FIND_CERT_FUNC
  • CERT_STORE_PROV_FREE_FIND_CERT_FUNC
  • CERT_STORE_PROV_GET_CERT_PROPERTY_FUNC
  • CERT_STORE_PROV_FIND_CRL_FUNC
  • CERT_STORE_PROV_FREE_FIND_CRL_FUNC
  • CERT_STORE_PROV_GET_CRL_PROPERTY_FUNC
  • CERT_STORE_PROV_FIND_CTL_FUNC
  • CERT_STORE_PROV_FREE_FIND_CTL_FUNC
  • CERT_STORE_PROV_GET_CTL_PROPERTY_FUNC

憑證回呼函式具有下列簽章:

typedef struct _CERT_STORE_PROV_FIND_INFO {
    DWORD               cbSize;
    DWORD               dwMsgAndCertEncodingType;
    DWORD               dwFindFlags;
    DWORD               dwFindType;
    const void          *pvFindPara;
} CERT_STORE_PROV_FIND_INFO, *PCERT_STORE_PROV_FIND_INFO;
typedef const CERT_STORE_PROV_FIND_INFO CCERT_STORE_PROV_FIND_INFO,
    *PCCERT_STORE_PROV_FIND_INFO;

typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FIND_CERT)(
        IN HCERTSTOREPROV hStoreProv,
        IN PCCERT_STORE_PROV_FIND_INFO pFindInfo,
        IN PCCERT_CONTEXT pPrevCertContext,
        IN DWORD dwFlags,
        IN OUT void **ppvStoreProvFindInfo,
        OUT PCCERT_CONTEXT *ppProvCertContext
        );

typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FREE_FIND_CERT)(
        IN HCERTSTOREPROV hStoreProv,
        IN PCCERT_CONTEXT pCertContext,
        IN void *pvStoreProvFindInfo,
        IN DWORD dwFlags
        );

typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_GET_CERT_PROPERTY)(
        IN HCERTSTOREPROV hStoreProv,
        IN PCCERT_CONTEXT pCertContext,
        IN DWORD dwPropId,
        IN DWORD dwFlags,
        OUT void *pvData,
        IN OUT DWORD *pcbData
        );

CRL 和 CTL 回呼函式的簽章與上述函式的指標相同 其指標會以 CRL_CONTEXT 或CTL_CONTEXT的指標取代 CERT_CONTEXT

當存放區 API 列舉、尋找或新增憑證時,會呼叫FIND_CERT回呼。 pPrevCertCoNtextppvStoreProvFindInfo 會設定為 Null 以起始新的 FIND。 傳回的 ppvStoreProvFindInfo 會在下一個尋找傳回時由提供者釋放。 提供者可以設定所有、部分或無憑證屬性。 提供者可以選擇延遲,直到呼叫GET_CERT_PROPERTY回呼為止。 建議提供者盡可能設定多個屬性,以允許複製到另一個存放區。

CertFindCertificateInStore支援下列憑證尋找類型:

  • CERT_FIND_ANY
  • CERT_FIND_SHA1_HASH
  • CERT_FIND_MD5_HASH
  • CERT_FIND_PROPERTY
  • CERT_FIND_PUBLIC_KEY
  • CERT_FIND_SUBJECT_NAME
  • CERT_FIND_SUBJECT_ATTR
  • CERT_FIND_ISSUER_NAME
  • CERT_FIND_ISSUER_ATTR
  • CERT_FIND_SUBJECT_STR_A
  • CERT_FIND_SUBJECT_STR_W
  • CERT_FIND_ISSUER_STR_A
  • CERT_FIND_ISSUER_STR_W
  • CERT_FIND_KEY_SPEC
  • CERT_FIND_ENHKEY_USAGE

系統會針對上述每個尋找類型呼叫FIND_CERT回呼。 傳遞至 CertFindCertificateInStore 的參數會直接複製到CERT_STORE_PROV_FIND_INFO結構,再呼叫FIND_CERT回呼。 如需不同尋找類型CERT_STORE_PROV_FIND_INFO結構之域值的詳細資訊,請參閱 CertFindCertificateInStore

下列憑證尋找類型支援 CertGetSubjectCertificateFromStoreCertGetIssuerCertificateFromStore API,並協助判斷憑證是否已存在於存放區中,再新增:

  • CERT_FIND_SUBJECT_CERT
  • CERT_FIND_ISSUER_OF
  • CERT_FIND_EXISTING

針對 CERT_FIND_SUBJECT_CERT, pvFindPara 參數會指向包含主體簽發者和 SerialNumber 的 CERT_INFO 結構。 針對 CERT_FIND_ISSUER_OF, pvFindPara 會指向主旨 的CERT_CONTEXT 結構。 針對 CERT_FIND_EXISTING, pvFindPara 會指向憑證 的CERT_CONTEXT ,以檢查其是否存在於存放區中。

當FIND_CERT回呼傳回的憑證未在後續FIND_CERT中釋放時呼叫FREE_FIND_CERT回呼,因此其 參考計數 會遞減為零,或是透過 呼叫 CertCloseStore來釋放。 呼叫 CLOSE 回呼之前,FIND_CERT回呼傳回的所有憑證都應該傳遞至提供者,方法是傳遞至呼叫FIND_CERT回呼或對FREE_FIND_CERT回呼的呼叫。 這同樣適用于 CRL 和 CTL 回呼。

如果 CertGetCertificateCoNtextProperty 找不到 pCertCoNtext 參數的指定屬性,則會呼叫GET_CERT_PROPERTY回呼。 GET_CRL_PROPERTY和GET_CTL_PROPERTY也是如此。

當存放區 API 列舉或取得 CRL,並在新增 CRL 之前呼叫FIND_CRL回呼。 將會定義下列 CRL 尋找類型:

針對 CRL_FIND_ISSUED_BY, pvFindPara 是 CRL 簽發者 CERT_CONTEXT 的指標。 針對 CRL_FIND_EXISTING, pvFindPara 是 CRL CRL_CONTEXT 的指標,可判斷它是否已存在於存放區中。

當存放區 API 列舉或尋找 CCL 時,會呼叫FIND_CTL回呼。 CertFindCTLInStore 支援下列 CTL尋找類型:

  • CTL_FIND_ANY
  • CTL_FIND_SHA1_HASH
  • CTL_FIND_MD5_HASH
  • CTL_FIND_USAGE
  • CTL_FIND_SUBJECT
  • CTL_FIND_EXISTING

系統會針對上述每個尋找類型呼叫FIND_CTL回呼。 在呼叫FIND_CTL回呼之前,傳遞至 CertFindCTLInStore 的參數會直接複製到CERT_STORE_PROV_FIND_INFO結構。 如需不同尋找類型CERT_STORE_PROV_FIND_INFO結構之域值的詳細資訊,請參閱 CertFindCTLInStore

CTL_FIND_EXISTING CTL 尋找類型有助於判斷 CTL 是否已存在於存放區中,再執行 CTL 新增。

針對 CTL_FIND_EXISTING, pvFindPara 是 CTL CTL_CONTEXT 結構的指標,可判斷它是否已存在於存放區中。