windows - Gemmer/Gendanner certs med MS CryptoAPI invaliderer den vedhæftede private nøgle

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har skrevet et program, der skal gemme og gendanne en brugercertifikat ved hjælp af Windows Crypto API. Jeg var under indtryk af, at det fungerede fint, men nu har en bruger klaget over, at den private nøgle, der var knyttet til certifikatet, er ugyldig efter cert er blevet genoprettet.


Jeg gemte certifikaterne ved hjælp af:


HCERTSTORE hCertStore =
    CertOpenStore(CERT\_STORE\_PROV\_PHYSICAL\_W,
    0,
    NULL,
    CERT\_SYSTEM\_STORE\_CURRENT\_USER |
    CERT\_STORE\_OPEN\_EXISTING\_FLAG |
    CERT\_STORE\_READONLY\_FLAG |
    CERT\_STORE\_UPDATE\_KEYID\_FLAG,
    (PVOID) storeName.c\_str());


Og så senere:


if (!CertSaveStore(hCertStore,
    0,
    CERT\_STORE\_SAVE\_AS\_STORE,
    CERT\_STORE\_SAVE\_TO\_FILENAME,
    (PVOID) saveFile.c\_str(),
    0))


Jeg forstår, at flag CERT\_STORE\_SAVE\_AS\_STORE skal betyde, at hele certen skal få serialiseret, herunder den private nøgle. Selvom jeg bemærker, at MSDN siger:



  'CERT\_KEY\_CONTEXT\_PROP\_ID egenskaben
  og de relaterede
  CERT\_KEY\_PROV\_HANDLE\_PROP\_ID og
  CERT\_KEY\_SPEC\_PROP\_ID værdier er ikke
  gemt til en serialiseret butik. '



.. som jeg tilstår, forstår jeg ikke rigtig.


Når jeg gendanner certifikatet, bruger jeg CertFindCertificateInStore () for at se om cert er allerede til stede, og kun hvis det ikke gør jeg:


bOK = CertAddCertificateContextToStore(
    hDestinationStore,
    pCertContext,
    CERT\_STORE\_ADD\_USE\_EXISTING,
    NULL);


At tilføje certifikatet tilbage ... Så mit spørgsmål er, hvorfor kan den private nøgle ikke bevares? Mangler jeg noget?

Bedste reference


Du bruger forkert CryptoAPI. Du skal bruge PFXExportCertStoreEx og PFXImportCertStore i stedet. [10] [11]


OPDATERET : Funktionerne er meget almindelige. Du kan ikke eksportere certifikater fra SmartCard selvfølgelig eller andre ikke-eksporterbare certifikater. BLOGGEN i funktionen er intet mere som indholdet af PFX-filen. For eksempel skal importen af ​​certifikatet fra PFX-filen gøre følgende:



  1. Åbn PFX-filen og læs fuld indhold i hukommelsen. Du kan selvfølgelig bruge kortlægningen i stedet.

  2. Eventuelt kan du bruge PFXIsPFXBlob -funktionen til at kontrollere, at filen virkelig indeholder, som svarer til PFX-filen.

  3. Du bruger PFXImportCertStore for at åbne BLOB (PFX) som kildecertifikatbutik.

  4. Du bruger CertOpenStore eller en anden funktion til at åbne destinationscertifikatbutikken, hvor du vil gemme certifikaterne fra PFX-filen.

  5. Du bruger CertEnumCertificatesInStore til at optage certifikater fra kildecertifikatbutikken (PFX) og til al certifikatbrug CertAddCertificateContextToStore for at tilføje certifikat fra kildecertifikatbutikken til destinationscertifikatbutikken. Certifikaterne med private nøgle vil blive importeret med den private nøgle.

  6. Du bruger CertCloseStore til at lukke begge åbne butikker.