Как проверить пароль сертификата pkcs # 12 (.PXF) с помощью openssl C API? - PullRequest
5 голосов
/ 13 января 2011

У меня есть сертификат .pxf (AFAIK PKCS # 12). Как я могу подтвердить данный пароль для этого сертификата, используя openssl C API?

Ответы [ 2 ]

8 голосов
/ 21 февраля 2011

Один из подходов к поиску таких ответов - найти утилиту OpenSSL, которая выполняет те же функции, что и вы.В этом случае вы можете использовать утилиту pkcs12 , поставляемую с OpenSSL, для проверки пароля.

Команда для проверки файла pfx следующая:

openssl pkcs12 -in mypfx.pfx -noout

Получив эту информацию, вы можете просмотреть исходный код ({openssl_src}/apps/pkcs12.c), чтобы узнать, как они это делают.

Исходный код показывает, что он вызывает PKCS12_verify_mac для проверкипароль.Сначала убедитесь, что нет пароля:

if( PKCS12_verify_mac(p12, NULL, 0) )
{
    printf("PKCS12 has no password.\n");
}

А затем, если есть пароль, проверьте его, передав его в качестве аргумента:

if( PKCS12_verify_mac(p12, password, -1) )
{
    printf("PKCS12 password matches.\n");
}

OpenSSL также имеет демо для работыс PKCS12 в openssl/demos/pkcs12.Демо pkread.c предоставляет пример парсинга pfx-файла с паролем.

EVP_PKEY *pkey;
X509 *cert;
STACK_OF(X509) *ca = NULL;

if (!PKCS12_parse(p12, password, &pkey, &cert, &ca)) {
    fprintf(stderr, "Error parsing PKCS#12 file\n");
    ERR_print_errors_fp(stderr);
    exit(1);
}

Полный пример, скомпилированный с gcc -std=c99 verifypfx.c -o verifypfx -lcrypto:

#include <stdio.h>
#include <errno.h>
#include <openssl/pkcs12.h>
#include <openssl/err.h>

int main(int argc, char *argv[])
{
        const char *password = "mypassword";
        PKCS12 *p12;

        // Load the pfx file.
        FILE *fp = fopen("mypfx.pfx", "rb");
        if( fp == NULL ) { perror("fopen"); return 1; }
        p12 = d2i_PKCS12_fp(fp, NULL);
        fclose(fp);

        OpenSSL_add_all_algorithms();
        ERR_load_PKCS12_strings();

        if( p12 == NULL ) { ERR_print_errors_fp(stderr); exit(1); }

        // Note:  No password is not the same as zero-length password.  Check for both.
        if( PKCS12_verify_mac(p12, NULL, 0) )
        {
                printf("PKCS12 has no password.\n");
        }
        else if( PKCS12_verify_mac(p12, password, -1) )
        {
                printf("PKCS12 password matches.\n");
        }
        else
        {
                printf("Password not correct.\n");
        }

        return 0;
}
1 голос
/ 23 февраля 2018

Используйте PKCS12_verify_mac().например.

FILE* f = fopen("myfile.pfx", "rb");
PKCS12* p12 = d2i_PKCS12_fp(f, NULL);
fclose(f);
if (!PKCS12_verify_mac(p12, (char*)"mypassword", strlen("mypassword")))
{
   // handle failure
}
...