Как проверить пароль сертификата PKCS#12 (.pxf) с API OpenSSL C?
Вопрос
У меня есть сертификат .pxf (afaik pkcs#12). Как я могу подтвердить заданный пароль для этого сертификата, используя API OpenSSL C?
Решение
Один из подходов к поиску ответов, подобных этому, - найти утилиту 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;
}
Другие советы
Использовать 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
}