c ++ - Kan OpenSSL på Windows bruge systemcertifikatbutikken?

Indlæg af Hanne Mølgaard Plasc

Problem



Nogle arbejder C ++-koden, som jeg 'm porterer fra Linux til Windows, fejler på Windows, fordi SSL\_get\_verify\_result() vender tilbage X509\_V\_ERR\_UNABLE\_TO\_GET\_ISSUER\_CERT\_LOCALLY.


Koden anvender SSL\_CTX\_set\_default\_verify\_paths() på Linux for at fortælle SSL at bare se på standard standardsteder for certifikatbutikken.


Er det muligt at få OpenSSL til at bruge systemcertifikatbutikken?

Bedste reference


Jeg har gjort det tidligere.
Håber det hjælper, hvis det er præcis det, du leder efter.



  1. Indlæs dit certifikat (i strukturen PCCERT\_CONTEXT fra Windows Cert Butik ved hjælp af Crypto API'er.

  2. Få krypteret indhold af det i binært format som det er. [[PCCERT\_CONTEXT->pbCertEncoded]].

  3. Analysér denne binære buffer i X509-certifikatobjektet ved hjælp af OpenSSLs d2i\_X509() metode.

  4. Hent handlen til OpenSSLs tillidsforretning ved hjælp af SSL\_CTX\_get\_cert\_store() metoden.

  5. Indlæse overanalyseret X509-certifikat i denne tillidsholder ved hjælp af X509\_STORE\_add\_cert() -metoden.

  6. Du er færdig!


Andre referencer 1


For de af jer, der stadig kæmper med dette som jeg har været, er her en prøvekode for at komme i gang:


#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#include <cryptuiapi.h>
#include <iostream>
#include <tchar.h>

#include "opensslx509.h"

#pragma comment (lib, "crypt32.lib")
#pragma comment (lib, "cryptui.lib")

#define MY\_ENCODING\_TYPE  (PKCS\_7\_ASN\_ENCODING | X509\_ASN\_ENCODING)

int main(void)
{
    HCERTSTORE hStore;
    PCCERT\_CONTEXT pContext = NULL;
    X509 *x509;
    X509\_STORE *store = X509\_STORE\_new();

    hStore = CertOpenSystemStore(NULL, L"ROOT");

    if (!hStore)
        return 1;

    while (pContext = CertEnumCertificatesInStore(hStore, pContext))
    {
        //uncomment the line below if you want to see the certificates as pop ups
        //CryptUIDlgViewContext(CERT\_STORE\_CERTIFICATE\_CONTEXT, pContext,   NULL, NULL, 0, NULL);

        x509 = NULL;
        x509 = d2i\_X509(NULL, (const unsigned char **)&pContext->pbCertEncoded, pContext->cbCertEncoded);
        if (x509)
        {
            int i = X509\_STORE\_add\_cert(store, x509);

            if (i == 1)
                std::cout << "certificate added" << std::endl;

            X509\_free(x509);
        }
    }

CertFreeCertificateContext(pContext);
CertCloseStore(hStore, 0);
system("pause");
return 0;

}

Andre referencer 2


Ingen. Ikke ud af boksen.



Nej det er ikke muligt ud af boksen. Det ville kræve yderligere programmering. Med OpenSSL har du to muligheder (ud af boksen):



  1. Brug OpenSSLs egen cert store (det er et hierarki af biblioteker oprettet af Perl script, der leveres med OpenSSL)

  2. Brug kun en certifikatkædefil, der er oprettet af dig (det er en tekstfil med alle PEM-kodede certifikater i en tillidskæde). Oprettelse af en sådan fil er let (tilføj den bare)


Andre referencer 3


Ja



Det er muligt at bruge OpenSSL til operation-as-usual, og brug kun CryptoAPI til certificeringsverifikationsprocessen. Jeg ser flere tråde omkring her på dette emne, og de fleste er tiptoed rundt/igennem.


Med CryptoAPI skal du:



  • afkode PEM til DER med CryptStringToBinary(),

  • opret et CERT\_CONTEXT objekt med CertCreateCertificateContext()

  • og verificer certifikatet i denne formular ved velkendt/dokumenteret procedure. (For eksempel her på ETutorials.) [22]


    For sidste trin til arbejde skal du også initialisere HCERTSTORE til en af ​​MY, ROOT, CA systemforretninger eller iterere gennem dem ... afhængigt af adfærd du vil have.