Как программно загрузить файл PKCS # 12 в OpenSSL? - PullRequest
14 голосов
/ 16 июня 2011

В приложении сервера SSL на основе OpenSSL как мы можем загрузить файл PKCS # 12 программным способом?

Кроме того, можно ли загрузить файл PKCS # 12 с сертификатом, ключом и CA в одном файле в OpenSSL?

Ответы [ 3 ]

37 голосов
/ 16 июня 2011

Да, вы можете загрузить файл PKCS # 12, содержащий сертификат, ключ и CA в одном файле с OpenSSL.

  • Используйте d2i_PKCS12_fp() или d2i_PKCS12_bio() для загрузки файла PKCS # 12.
  • При необходимости используйте PKCS12_verify_mac() для подтверждения пароля.
  • Используйте PKCS12_parse(), который расшифровывает и извлекает ключ, сертификат и ЦС для вас.

С openssl-1.0.0d / demos / pkcs12 / pkread.c :

#include <stdio.h>
#include <stdlib.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/pkcs12.h>

/* Simple PKCS#12 file reader */

int main(int argc, char **argv)
{
    FILE *fp;
    EVP_PKEY *pkey;
    X509 *cert;
    STACK_OF(X509) *ca = NULL;
    PKCS12 *p12;
    int i;
    if (argc != 4) {
        fprintf(stderr, "Usage: pkread p12file password opfile\n");
        exit (1);
    }
    OpenSSL_add_all_algorithms();
    ERR_load_crypto_strings();
    if (!(fp = fopen(argv[1], "rb"))) {
        fprintf(stderr, "Error opening file %s\n", argv[1]);
        exit(1);
    }
    p12 = d2i_PKCS12_fp(fp, NULL);
    fclose (fp);
    if (!p12) {
        fprintf(stderr, "Error reading PKCS#12 file\n");
        ERR_print_errors_fp(stderr);
        exit (1);
    }
    if (!PKCS12_parse(p12, argv[2], &pkey, &cert, &ca)) {
        fprintf(stderr, "Error parsing PKCS#12 file\n");
        ERR_print_errors_fp(stderr);
        exit (1);
    }
    PKCS12_free(p12);
    if (!(fp = fopen(argv[3], "w"))) {
        fprintf(stderr, "Error opening file %s\n", argv[1]);
        exit(1);
    }
    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));
    }

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

    fclose(fp);
    return 0;
}
1 голос
/ 07 июня 2013

Имейте в виду, что код записывает сертификаты как доверенные сертификаты (зашифрованные). Если вам нужны незашифрованные сертификаты, измените вызовы PEM_write_X509_AUX () на PEM_write_X509 ().

1 голос
/ 16 июня 2011

Попробуйте man SSL, который дает вам список функций OpenSSL.Нечто подобное SSL_load_client_CA_file может удовлетворить ваши потребности;это зависит от того, находится сертификат в файле на диске или уже в памяти.Есть много вспомогательных функций, одна из них сделает свое дело.Также проверьте man PEM для процедур обработки PEM.

Edit: Hm, возможно комбинация d2i_PKCS12_fp и PKCS12_parse (оба доступны из <openssl/pkcs12.h>) позволяет вам читатьсертификат из файла и проанализируйте его.

...