Не удается получить открытый ключ из файлов .cer с помощью openssl на C - PullRequest
1 голос
/ 20 мая 2019

При использовании openssl в коде EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a) метод не может получить открытый ключ в файле .cer.


int load_cert() {

    FILE *fp = fopen("/home/android/cafile/cerfile.cer", "r");
    if (!fp) {
        fprintf(stderr, "unable to open: %s\n", path);
        return EXIT_FAILURE;
    }

    X509 *x509data = NULL;
    // X509 *cert = d2i_X509_bio(fp, NULL);
    d2i_X509_fp(fp, &x509data);
    if (!x509data) {
        fprintf(stderr, "unable to parse certificate in: %s\n", path);
        fclose(fp);
        return EXIT_FAILURE;
    }
    char issuer_name[1024];
    char subject_name[1024];

    X509_NAME_oneline(X509_get_issuer_name(x509data), issuer_name,
                      sizeof(issuer_name));
    X509_NAME_oneline(X509_get_subject_name(x509data), subject_name,
                      sizeof(subject_name));

    printf("Issuer  name: %s\n", issuer_name);
    printf("Subject name: %s\n", subject_name);

    EVP_PKEY *pkey;
    EVP_PKEY *a = NULL;
    //d2i_PUBKEY_fp(fp, &a);
    pkey = d2i_PUBKEY_fp(fp, &a);
    d2i_PUBKEY_fp(fp, NULL);
    if (pkey == NULL) {
        printf("d2i_PUBKEY_fp pkey error\n");
    }
    if (a == NULL) {
        printf("d2i_PUBKEY_fp a error\n");
    }
// any additional processing would go here..
    fclose(fp);
    return 0;
}

файл cerfile.cer

issuer_name иsubject_name можно получить правильно, но pkey и a равны нулю.

1 Ответ

1 голос
/ 20 мая 2019

Вы, вероятно, ожидаете, что открытый ключ будет в сериализованной форме непосредственно после сертификата X509 в файле. Открытый ключ содержится в сертификате - поэтому вы уже прочитали его, когда выполняли вызов d2i_X509_fp, и он содержится в объекте x509data. Чтобы извлечь его как EVP_PKEY, используйте X509_get_pubkey, как описано здесь:

https://www.openssl.org/docs/man1.1.1/man3/X509_get_pubkey.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...