2017-07-17 5 views
0

J'essaye d'exporter le fichier de pfx qui contient la chaîne de certificats et la clef privée du magasin de certificats de Windows, convertissez oit dans le format de PEM et l'enregistrez dans le dossier qui est lu par l'application openssl. je le fais par les étapes suivantes (commandes capi/OpenSSL):chaîne de certificats d'exportation et d'importation

créant magasin de mémoire - CertOpenStore

magasin système ouvert - CertOpenSystemStore

trouver le certificat souhaité en fonction du nom symphatique - CertFindCertificateInStore

Ajouter le certificat désiré au magasin de mémoire - CertAddCertificateContextToStore

mémoire d'exportation - PFXExportCer tStoreEx

blob convertir en base64 et enregistrer dans le fichier

chaîne certificats d'importation de PEM FILE- SSL_CTX_use_certificate_chain_file

Importation clé privée à partir du fichier PEM - SSL_CTX_use_PrivateKey_file

1) Je n'ai pas trouvé une commande qui convertit pfx (mémoire blob/fichier) au format pem

2) ce scénario exporte-t-il toutes les chaînes de certificats qui étaient à l'origine stockées dans le fichier pfx

3) ne importe SSL_CTX_use_certificate_chain_file toute la chaîne de certificats ou je dois utiliser d'autres commandes pour importer toute la chaîne dans la structure CTX

Merci à l'avance

Répondre

0

1) Cela a fonctionné pour moi

{ 
    FILE* fp = NULL; 
    CString errorS = NULL; 
    PKCS12* p12 = NULL; 
    EVP_PKEY* pkey = NULL; 
    X509* cert = NULL; 
    STACK_OF(X509) *ca = NULL; 

    int i; 
    pkey = (EVP_PKEY*)new EVP_PKEY; 
    cert = (X509*)new X509; 

    do 
    { 
     if (fopen_s(&fp, CT2A(pkcs12File), "rb")) 
     { 
      errorS = ("Error opening file %s\n", CT2A(pkcs12File)); 
      break; 
     } 
     p12 = d2i_PKCS12_fp(fp, NULL); 
     OpenSSL_add_all_algorithms(); 
     ERR_load_crypto_strings(); 
     if (!p12) 
     { 
      errorS = ("Error reading PKCS#12 file\n"); 
      break; 
     } 
     if (!PKCS12_parse(p12, CT2A(szPassword), &pkey, &cert, &ca)) 
     { 
      errorS = ("Error parsing PKCS#12 file\n"); 
      break; 
     } 

     if (fopen_s(&fp, CT2A(pszNameString + L".pem"), "w")) 
     { 
      errorS = ("Error opening file %s\n", CT2A(pemFileName)); 
      break; 
     } 
     if (pkey) 
     { 
      fprintf(fp, "***Private Key***\n"); 
      PEM_write_PrivateKey(fp, pkey, NULL, NULL, 0, NULL, NULL); 
     } 
     if (cert) 
     { 
      fprintf(fp, "***User Certificate***\n"); 
      PEM_write_X509_AUX(fp, cert); 
     } 
     if (ca && sk_X509_num(ca)) 
     { 
      fprintf(fp, "***Other Certificates***\n"); 
      for (i = 0; i < sk_X509_num(ca); i++) 
       PEM_write_X509_AUX(fp, sk_X509_value(ca, i)); 
     } 
    } while (0); 

     PKCS12_free(p12); 
     sk_X509_pop_free(ca, X509_free); 
     X509_free(cert); 
     EVP_PKEY_free(pkey); 

    if (NULL != fp) 
    { 
     fclose(fp); 
    } 
} 

2 + 3) SSL_CTX_use_certificate_chain_file importer tous les certificats chaîne