Erweitern der CertOpenStore-Funktionalität

Der Zertifikatspeicher ist von zentraler Bedeutung für alle Zertifikatverwaltungsvorgänge. Die Funktionalität der CertOpenStore-Funktion kann durch die Verwendung einer installierbaren (oder registrierten) certificate-store-provider-Funktion erweitert werden. Eine Übersicht darüber, wie Sie Funktionen für die Verwendung mit cryptoAPI installieren oder registrieren, finden Sie unter Übersicht über die OID.

Hinweis

Benutzerdefinierte Zertifikatspeicher werden bei automatisierten Bereitstellungen nicht automatisch migriert. Um benutzerdefinierte Zertifikatspeicher zu migrieren, müssen Sie ein Manifest für die Migration der benutzerdefinierten Speicher erstellen und das Windows User State Migration Tool (USMT) verwenden.

 

CertOpenStore öffnet einen leeren Speicher im Arbeitsspeicher und ruft die Speicheranbieterfunktion (sofern registriert oder installiert) mithilfe des Objektbezeichners (OID) auf, der im lpszStoreProvider-Parameter übergeben wurde. Eine Liste der vordefinierten Anbietertypen, die mit cryptoAPI bereitgestellt werden, finden Sie unter CertOpenStore.

Die Speicheranbieterfunktion kopiert seine Zertifikate und Zertifikatsperrlisten (Certificate Revocation Lists , CRLs) in den speicherinternen Speicher, der durch das an ihn übergebene hCertStore-Handle angegeben wird. Die neue Speicheranbieterfunktion kann jede der CryptoAPI-Zertifikatspeicherfunktionen wie CertAddCertificateContextToStore oder CertAddSerializedElementToStore verwenden, um seine Zertifikate und CRLs dem Speicher im Arbeitsspeicher hinzuzufügen. Darüber hinaus gibt die Speicheranbieterfunktion optional Werte für alle Datenmember der CERT_STORE_PROV_INFO-Struktur zurück. Die Funktion muss diese Struktur nur aktualisieren, wenn sie zusätzliche Rückruffunktionen unterstützt. Wenn der Speicher beispielsweise ein schreibgeschützter Speicher sein sollte, wäre die Unterstützung anderer Rückruffunktionen wahrscheinlich nicht erforderlich. Ausführliche Informationen und Prototypen der möglichen Rückruffunktionen finden Sie unter Rückruffunktionen des Zertifikatspeicheranbieters.

Der TrustedPeople-Speicher pro Benutzer ist auf vordefinierte physische Speicher beschränkt. Sie können den TrustedPeople-Speicher nicht pro Benutzer erweitern. Sie können jedoch den TrustedPeople-Speicher des lokalen Computers erweitern.

Windows XP und Windows Server 2003: Der TrustedPeople-Speicher pro Benutzer ist nicht auf vordefinierte physische Speicher beschränkt.

Eines der Datenmember der CERT_STORE_PROV_INFO-Struktur ist das rgpvStoreProvFunc-Array . Wenn die Speicheranbieterfunktion mindestens eine der Rückruffunktionen unterstützen muss, muss sie Zeiger für dieses Array bereitstellen. Diese Zeiger müssen auf die Rückruffunktionen verweisen, die für andere Zertifikatspeicheraktivitäten (z. B. das Schließen des Speichers) verwendet werden sollen. Die folgende Abbildung zeigt den Ablauf dieses Prozesses.

certopenstore-Funktionalität

Wie in der folgenden Abbildung gezeigt, verwenden andere CryptoAPI-Funktionen (z. B . CertCloseStore) nach dem Öffnen des Speichers das Array von Zeigern, um auf die Rückruffunktionen zuzugreifen, die die beabsichtigte Aufgabe ausführen. Die Definition der CERT_STORE_PROV_INFO-Struktur und die Prototypen der Standardrückruffunktionen, die mit der CryptoAPI bereitgestellt werden, werden unter Rückruffunktionen des Zertifikatspeicheranbieters angezeigt.

certclosestore-Funktionalität

Die Speicher-APIs ermöglichen es einem Speicheranbieter, die Zertifikate, CRLs und Zertifikatvertrauenslisten (CERTIFICATE Trust Lists , CTLs) außerhalb des Caches des Speichers zu verwalten (z. B. eine externe Datenbank mit Zertifikaten, wie sie von der Microsoft Certificate Server-Datenbank bereitgestellt wird).

CertOpenStore sendet über den Parameter pszStoreProvider an die entsprechende Installierbare Anbieterfunktion CertDllOpenStoreProv . Der Anbieter gibt Informationen im pStoreProvInfo-Parameter zurück, die auf eine CERT_STORE_PROV_INFO Struktur verweist. Die CERT_STORE_PROV_INFO-Struktur enthält ein dwStoreProvFlags-Element . Das CERT_STORE_PROV_EXTERNAL_FLAG-Flag wurde hinzugefügt, damit der Anbieter angeben kann, dass sich die Zertifikate, CRLs und CTLs außerhalb des Caches des Speichers befinden.

CertDllOpenStoreProv gibt ein Array von Rückruffunktionen zurück. Ein Anbieter kann die folgenden Rückruffunktionen implementieren:

  • 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

Bei Aufrufen der WRITE_CERT-, WRITE_CRL- und WRITE_CTL Rückruffunktionen, wenn die CERT_STORE_PROV_WRITE_ADD_FLAG festgelegt ist, enthält die oberen 16 Bit des dwFlags-Parameters den dwAddDisposition-Wert . Zur Unterstützung externer Speicher kann ein Anbieter die folgenden Rückruffunktionen implementieren:

  • 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

Die Zertifikatrückruffunktionen verfügen über die folgenden Signaturen:

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
        );

Die Signaturen für die CRL- und CTL-Rückruffunktionen sind identisch mit den oben genannten, wobei der Zeiger auf die CERT_CONTEXT durch einen Zeiger auf eine CRL_CONTEXT oder CTL_CONTEXT ersetzt wird.

Der FIND_CERT Rückrufs wird aufgerufen, wenn die Speicher-APIs Zertifikate aufzählen, suchen oder hinzufügen. pPrevCertContext und ppvStoreProvFindInfo sind auf NULL festgelegt, um eine neue FIND-Datei zu initiieren. Die zurückgegebene ppvStoreProvFindInfo wird beim nächsten Fund zurückgegeben, zu dem sie vom Anbieter freigegeben werden kann. Der Anbieter kann alle, einige oder keine der Zertifikateigenschaften festlegen. Der Anbieter hat die Möglichkeit, zurückzuschieben, bis der GET_CERT_PROPERTY Rückruf aufgerufen wird. Es wird empfohlen, dass Anbieter so viele Eigenschaften wie möglich festlegen, um das Kopieren in einen anderen Speicher zuzulassen.

Die folgenden Zertifikatsuchetypen werden in CertFindCertificateInStore unterstützt:

  • 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

Der FIND_CERT Rückruf wird für jeden der oben genannten Suchtypen aufgerufen. Die an CertFindCertificateInStore übergebenen Parameter werden direkt in die CERT_STORE_PROV_FIND_INFO-Struktur kopiert, bevor der FIND_CERT Rückruf aufgerufen wird. Ausführliche Informationen zu den Feldwerten für die verschiedenen Suchtypen der CERT_STORE_PROV_FIND_INFO-Struktur finden Sie unter CertFindCertificateInStore.

Die folgenden Zertifikatsuchetypen unterstützen die APIs CertGetSubjectCertificateFromStore und CertGetIssuerCertificateFromStore und helfen zu ermitteln, ob das Zertifikat bereits im Speicher vorhanden ist, bevor sie hinzugefügt werden:

  • CERT_FIND_SUBJECT_CERT
  • CERT_FIND_ISSUER_OF
  • CERT_FIND_EXISTING

Für CERT_FIND_SUBJECT_CERT zeigt der parameter pvFindPara auf eine CERT_INFO-Struktur , die den Issuer und die SerialNumber des Betreffs enthält. für CERT_FIND_ISSUER_OF verweist pvFindPara auf eine CERT_CONTEXT Struktur des Subjekts. Für CERT_FIND_EXISTING verweist pvFindPara auf eine CERT_CONTEXT des Zertifikats, um zu überprüfen, ob es im Speicher vorhanden ist.

Der FREE_FIND_CERT Rückrufs wird aufgerufen, wenn das vom FIND_CERT Rückruf zurückgegebene Zertifikat nicht freigegeben wurde, indem es in einer nachfolgenden nächsten FIND_CERT verwendet wurde, wodurch die Verweisanzahl auf 0 erhöht wurde, oder durch einen Aufruf von CertCloseStore freigegeben wurde. Bevor der CLOSE-Rückruf aufgerufen wird, sollten alle vom FIND_CERT Rückruf zurückgegebenen Zertifikate an den Anbieter freigegeben werden, indem sie an einen Aufruf des FIND_CERT Rückrufs oder einen Aufruf des FREE_FIND_CERT Rückrufs übergeben werden. Gleiches gilt für die CRL- und CTL-Rückrufe.

Der GET_CERT_PROPERTY Rückrufs wird von CertGetCertificateContextProperty aufgerufen, wenn die angegebene Eigenschaft für den pCertContext-Parameter nicht gefunden werden kann. Gleiches gilt für GET_CRL_PROPERTY und GET_CTL_PROPERTY.

Der FIND_CRL Rückrufs wird aufgerufen, wenn die Speicher-APIs CRLs aufzählen oder abrufen und vor dem Hinzufügen einer Zertifikatsperrliste. Die folgenden CRL-Suchtypen werden definiert:

Für CRL_FIND_ISSUED_BY ist pvFindPara ein Zeiger auf eine CERT_CONTEXT des Zertifikatsperrlistenausstellers. Für CRL_FIND_EXISTING ist pvFindPara ein Zeiger auf eine CRL_CONTEXT der Zertifikatsperrliste, um zu bestimmen, ob sie bereits im Speicher vorhanden ist.

Der FIND_CTL Rückrufs wird aufgerufen, wenn die Speicher-APIs CTLs aufzählen oder suchen. Die folgenden CTL-Suchtypen werden in CertFindCTLInStore unterstützt:

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

Der FIND_CTL Rückruf wird für jeden der oben genannten Suchtypen aufgerufen. Die an CertFindCTLInStore übergebenen Parameter werden direkt in die CERT_STORE_PROV_FIND_INFO-Struktur kopiert, bevor der FIND_CTL Rückruf aufgerufen wird. Ausführliche Informationen zu den Feldwerten für die verschiedenen Suchtypen der CERT_STORE_PROV_FIND_INFO-Struktur finden Sie unter CertFindCTLInStore.

Der CTL_FIND_EXISTING CTL-Suchtyp hilft ihnen, zu ermitteln, ob die CTL bereits im Speicher vorhanden ist, bevor Sie eine CTL hinzufügen.

Für CTL_FIND_EXISTING ist pvFindPara ein Zeiger auf die CTL_CONTEXT Struktur der CTL, um zu bestimmen, ob sie bereits im Speicher vorhanden ist.