2013-05-15 4 views
1

Je dois déterminer si la carte à puce comporte un certificat donné. Pour cela, je suis d'abord l'acquisition de la HCRYPTPROV (gérer le CSP) en utilisant CryptAcquireContext, puis en l'utilisant pour ouvrir le magasin du système (OpenSystemStore), puis en énumérant les certificats.Certificats de numérotation disponibles uniquement sur la carte à puce

Fonctionne parfaitement sur Windows XP. Sur Windows 7, cela pose des problèmes en raison de certificats périmés/anciens stockés en magasin. Windows stocke/copie les certificats dans son magasin à partir de la carte à puce. Cela signifie que si j'ai deux certificats Cert1 et Cert2 sur Smart Card et j'ai utilisé une carte à puce pour se connecter à Windows. alors Windows stocke ces certs dans ses magasins, nous pouvons le voir en allant sur IE-> Internet Options-> Contents-> Certificates. Ensuite, si je supprime le Cert2 de la carte à puce, alors aussi Cert2 est montré dans Windows Store et cette chose est en train de casser mon code.

Je dois donc énumérer les certificats qui sont disponibles uniquement sur la carte à puce et non dans le magasin Windows.

+1

N'a pas programmé Windows pendant un certain temps, mais normalement un certificat sur une carte à puce est accompagné d'une clé privée pour faire la signature ou le décryptage réel. Pouvez-vous peut-être essayer d'accéder ou d'utiliser la clé privée et voir ce qui se passe? –

+0

Merci owlstead. Cela a fonctionné pour moi. J'ai utilisé l'API CryptAcquireCertificatePrivateKey pour vérifier la clé privée correspondante pour un cert donné. Il le retournera avec succès s'il est disponible sur la carte à puce – MLS

+0

Heureux de vous aider Mohammed. –

Répondre

1

En supposant que le HCRYPTPROV vous achetez est pour la carte à puce, utilisez CryptGetProvParam avec le paramètre PP_USER_CERTSTORE:

obtient le magasin de certificats d'utilisateur pour la carte à puce. Ce magasin de certificats contient tous les certificats utilisateur stockés sur la carte à puce.

par exemple.

HCERTSTORE hCertStore = NULL; 
DWORD size = sizeof(hCertStore); 
CryptGetProvParam(hProv, PP_USER_CERTSTORE, (PBYTE)&hCertStore, &size, 0); 

Vous pouvez ensuite énumérer les certificats de carte à puce de la HCERTSTORE comme avec le magasin système.

La page MSDN indique "Windows XP: ce paramètre n'est pas pris en charge". mais cela fonctionne très bien sur XP avec le dernier Service Pack.

L'équivalent CNG est NCryptGetProperty avec le paramètre NCRYPT_USER_CERTSTORE_PROPERTY.

+0

Merci Ian pour votre solution. Cependant PP_USER_CERTSTORE peut ne pas être pris en charge par tous les CSP. J'ai essayé avec Alladin eToken. Ça ne marche pas. – MLS

Questions connexes