擴充 CertOpenStore 功能
憑證存放區是所有憑證管理作業的核心。 CertOpenStore函式的功能可以透過使用可安裝 (或已註冊) 的憑證存放區提供者函式來擴充。 如需如何安裝或註冊函式以搭配 CryptoAPI 使用的概觀,請參閱 OID 概觀。
注意
執行自動化部署時,不會自動移轉自訂憑證存放區。 若要移轉自訂憑證存放區,您必須建立資訊清單來移轉自訂存放區,並使用 Windows 使用者狀態移轉工具 (USMT) 。
CertOpenStore會在記憶體中開啟空的存放區,並使用在lpszStoreProvider參數中傳遞的物件識別碼) (OID) ,呼叫存放區提供者函式 ( (。 如需 CryptoAPI 所提供的預先定義提供者類型清單,請參閱 CertOpenStore。
存放區提供者函式會將其憑證和 憑證撤銷清單 (CRL) 複製到傳遞給它的 hCertStore 控制碼所指定的記憶體內部存放區。 新的存放區提供者函式可以使用任何 CryptoAPI 憑證存放區函式,例如 CertAddCertificateCoNtextToStore 或 CertAddSerializedElementToStore,將其憑證和 CRL 新增至記憶體內部存放區。 此外,存放區提供者函式會選擇性地傳回 CERT_STORE_PROV_INFO 結構之所有資料成員的值。 如果函式支援其他回呼函式,則函式只需要更新這個結構。 例如,如果存放區是唯讀存放區,則可能不需要支援其他回呼函式。 如需可能回呼函式的詳細資料和原型,請參閱 憑證存放區提供者回呼函式。
每個使用者 TrustedPeople 存放區僅限於預先定義的實體存放區。 您無法擴充每個使用者 TrustedPeople 存放區。 不過,您可以擴充本機電腦 TrustedPeople 存放區。
Windows XP 和 Windows Server 2003: 每個使用者 TrustedPeople 存放區不限於預先定義的實體存放區。
CERT_STORE_PROV_INFO結構的其中一個資料成員是rgpvStoreProvFunc陣列。 如果存放區提供者函式需要支援一或多個回呼函式,則必須提供此陣列的指標。 這些指標必須指向要用於其他憑證存放區活動的回呼函式, (例如關閉存放區) 。 下圖顯示此程式的流程。
如下圖所示,開啟存放區之後,其他 CryptoAPI 函式 (例如 CertCloseStore) 使用指標陣列來存取執行預定工作的回呼函式。 證書存儲提供者回呼函式會顯示CERT_STORE_PROV_INFO結構和預設回呼函式的原型定義,這些函式隨附于 CryptoAPI。
存放區 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回呼。 pPrevCertCoNtext 和 ppvStoreProvFindInfo 會設定為 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。
下列憑證尋找類型支援 CertGetSubjectCertificateFromStore 和 CertGetIssuerCertificateFromStore 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 結構的指標,可判斷它是否已存在於存放區中。