Extension des fonctionnalités de CertOpenStore

Le magasin de certificats est central pour toutes les opérations de gestion des certificats. La fonctionnalité de la fonction CertOpenStore peut être étendue à l’aide d’une fonction de fournisseur de magasin de certificats installable (ou inscrite). Pour obtenir une vue d’ensemble de l’installation ou de l’inscription de fonctions à utiliser avec CryptoAPI, consultez Vue d’ensemble de l’OID.

Notes

Les magasins de certificats personnalisés ne sont pas automatiquement migrés lors de déploiements automatisés. Pour migrer des magasins de certificats personnalisés, vous devez créer un manifeste pour migrer les magasins personnalisés et utiliser l’outil de migration de l’état utilisateur Windows (USMT).

 

CertOpenStore ouvre un magasin vide en mémoire et appelle la fonction de fournisseur de magasin (si elle est inscrite ou installée) à l’aide de l’identificateur d’objet (OID) qui a été passé dans le paramètre lpszStoreProvider . Pour obtenir la liste des types de fournisseurs prédéfinis fournis avec cryptoAPI, consultez CertOpenStore.

La fonction de fournisseur de magasin copie ses certificats et ses listes de révocation de certificats (CRL) dans le magasin en mémoire spécifié par le handle hCertStore qui lui a été transmis. La nouvelle fonction de fournisseur de magasin peut utiliser l’une des fonctions de magasin de certificats CryptoAPI, telles que CertAddCertificateContextToStore ou CertAddSerializedElementToStore, pour ajouter ses certificats et ses listes de révocation de certificats au magasin en mémoire. En outre, la fonction store-provider retourne éventuellement des valeurs pour tous les membres de données de la structure CERT_STORE_PROV_INFO . La fonction doit uniquement mettre à jour cette structure si elle prend en charge des fonctions de rappel supplémentaires. Par exemple, si le magasin devait être un magasin en lecture seule, la prise en charge d’autres fonctions de rappel ne serait probablement pas nécessaire. Pour plus d’informations et des prototypes des fonctions de rappel possibles, consultez Fonctions de rappel du fournisseur de magasin de certificats.

Le magasin TrustedPeople par utilisateur est limité aux magasins physiques prédéfinis. Vous ne pouvez pas étendre le magasin TrustedPeople par utilisateur. Toutefois, vous pouvez étendre le magasin TrustedPeople de l’ordinateur local.

Windows XP et Windows Server 2003 : Le magasin TrustedPeople par utilisateur n’est pas limité aux magasins physiques prédéfinis.

L’un des membres de données de la structure CERT_STORE_PROV_INFO est le tableau rgpvStoreProvFunc . Si la fonction de fournisseur de magasin doit prendre en charge une ou plusieurs fonctions de rappel, elle doit fournir des pointeurs pour ce tableau. Ces pointeurs doivent pointer vers les fonctions de rappel qui doivent être utilisées pour d’autres activités de magasin de certificats (telles que la fermeture du magasin). L’illustration suivante montre le flux de ce processus.

Fonctionnalité certopenstore

Comme le montre l’illustration suivante, une fois le magasin ouvert, d’autres fonctions CryptoAPI (telles que CertCloseStore) utilisent le tableau de pointeurs pour accéder aux fonctions de rappel qui effectuent la tâche prévue. La définition de la structure CERT_STORE_PROV_INFO et les prototypes des fonctions de rappel par défaut fournies avec cryptoAPI sont affichés dans fonctions de rappel du fournisseur de magasin de certificats.

Fonctionnalité certclosestore

Les API de magasin permettent à un fournisseur de magasin de gérer les certificats, les listes de certificats et les listes d’approbation de certificats (CTL) en dehors du cache du magasin (par exemple, une base de données externe de certificats, telle que fournie par la base de données du serveur de certificats Microsoft).

CertOpenStore distribue le paramètre pszStoreProvider à la fonction de fournisseur installable CertDllOpenStoreProv appropriée. Le fournisseur retourne des informations dans le paramètre pStoreProvInfo qui pointe vers une structure CERT_STORE_PROV_INFO . La structure CERT_STORE_PROV_INFO contient un membre dwStoreProvFlags . L’indicateur CERT_STORE_PROV_EXTERNAL_FLAG a été ajouté pour permettre au fournisseur d’indiquer que les certificats, listes de révocation de certificats et CTL sont externes au cache du magasin.

CertDllOpenStoreProv retourne un tableau de fonctions de rappel. Un fournisseur peut implémenter les fonctions de rappel suivantes :

  • 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

Lors des appels aux fonctions de rappel WRITE_CERT, WRITE_CRL et WRITE_CTL lorsque le CERT_STORE_PROV_WRITE_ADD_FLAG est défini, les 16 bits supérieurs du paramètre dwFlags contiennent la valeur dwAddDisposition . Pour prendre en charge les magasins externes, un fournisseur peut implémenter les fonctions de rappel suivantes :

  • 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

Les fonctions de rappel de certificat ont les signatures suivantes :

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

Les signatures pour les fonctions de rappel CRL et CTL sont identiques à celles ci-dessus, le pointeur vers le CERT_CONTEXT remplacé par un pointeur vers un CRL_CONTEXT ou un CTL_CONTEXT.

Le rappel FIND_CERT est appelé lorsque les API du magasin énumèrent, recherchent ou ajoutent des certificats. pPrevCertContext et ppvStoreProvFindInfo sont définis sur NULL pour lancer une nouvelle recherche. Le ppvStoreProvFindInfo retourné est repassé à la prochaine recherche à laquelle il peut être libéré par le fournisseur. Le fournisseur peut définir toutes, certaines ou aucune des propriétés de certificat. Le fournisseur a la possibilité de différer jusqu’à ce que le rappel GET_CERT_PROPERTY soit appelé. Il est recommandé aux fournisseurs de définir autant de propriétés que possible pour permettre la copie dans un autre magasin.

Les types de recherche de certificat suivants sont pris en charge dans 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

Le rappel FIND_CERT est appelé pour chacun des types de recherche ci-dessus. Les paramètres passés à CertFindCertificateInStore sont copiés directement dans la structure CERT_STORE_PROV_FIND_INFO avant l’appel du rappel FIND_CERT. Pour plus d’informations sur les valeurs de champ pour les différents types de recherche de la structure CERT_STORE_PROV_FIND_INFO, consultez CertFindCertificateInStore.

Les types de recherche de certificat suivants prennent en charge les API CertGetSubjectCertificateFromStore et CertGetIssuerCertificateFromStore et permettent de déterminer si le certificat existe déjà dans le magasin avant d’ajouter :

  • CERT_FIND_SUBJECT_CERT
  • CERT_FIND_ISSUER_OF
  • CERT_FIND_EXISTING

Par CERT_FIND_SUBJECT_CERT, le paramètre pvFindPara pointe vers une structure de CERT_INFO qui contient l’émetteur et le numéro serial de l’objet. Pour CERT_FIND_ISSUER_OF, pvFindPara pointe vers une structure CERT_CONTEXT du sujet. Pour CERT_FIND_EXISTING, pvFindPara pointe vers un CERT_CONTEXT du certificat pour case activée de son existence dans le magasin.

Le rappel FREE_FIND_CERT est appelé lorsque le certificat retourné par le FIND_CERT rappel n’a pas été libéré en étant utilisé dans un FIND_CERT suivant, son nombre de références étant ainsi décrémenté à zéro, ou en étant libéré par un appel à CertCloseStore. Avant l’appel du rappel CLOSE, tous les certificats retournés par le rappel FIND_CERT doivent être libérés au fournisseur en passant à un appel au rappel FIND_CERT ou à un appel au rappel FREE_FIND_CERT. Il en va de même pour les rappels CRL et CTL.

Le rappel GET_CERT_PROPERTY est appelé par CertGetCertificateContextProperty s’il ne trouve pas la propriété spécifiée pour le paramètre pCertContext . Il en va de même pour les GET_CRL_PROPERTY et les GET_CTL_PROPERTY.

Le rappel FIND_CRL est appelé lorsque les API de magasin énumèrent ou obtiennent des listes de révocation de certificats et avant d’ajouter une liste de révocation de certificats. Les types de recherche de liste de révocation de certificats suivants seront définis :

Par CRL_FIND_ISSUED_BY, pvFindPara est un pointeur vers un CERT_CONTEXT de l’émetteur de la liste de révocation de certificats. Par CRL_FIND_EXISTING, pvFindPara est un pointeur vers un CRL_CONTEXT de la liste de révocation de certificats pour déterminer s’il existe déjà dans le magasin.

Le rappel FIND_CTL est appelé lorsque les API du magasin énumèrent ou recherchent des listes de dll. Les types de recherche CTL suivants sont pris en charge dans CertFindCTLInStore :

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

Le rappel FIND_CTL est appelé pour chacun des types de recherche ci-dessus. Les paramètres passés à CertFindCTLInStore sont copiés directement dans la structure CERT_STORE_PROV_FIND_INFO avant l’appel du rappel FIND_CTL. Pour plus d’informations sur les valeurs de champ pour les différents types de recherche de la structure CERT_STORE_PROV_FIND_INFO, consultez CertFindCTLInStore.

Le type de recherche CTL CTL_FIND_EXISTING permet de déterminer si la CTL existe déjà dans le magasin avant d’ajouter une CTL.

Par CTL_FIND_EXISTING, pvFindPara est un pointeur vers la structure CTL_CONTEXT de la CTL pour déterminer si elle existe déjà dans le magasin.