如何使用openssl C API验证pkcs#12证书(.PXF)的密码?

Til*_*ütz 7 c openssl pkcs#12

我有.pxf(AFAIK PKCS#12)证书.如何使用openssl C API确认此证书的给定密码?

ind*_*div 10

找到这样的答案的一种方法是找到一个OpenSSL实用程序,它执行与您尝试执行的操作相同的功能.在这种情况下,您可以使用OpenSSL附带的pkcs12实用程序来验证密码.

验证pfx文件的命令如下:

openssl pkcs12 -in mypfx.pfx -noout
Run Code Online (Sandbox Code Playgroud)

有了这些信息,您就可以查看其源代码({openssl_src}/apps/pkcs12.c)以了解它们是如何做到的.

源代码显示它调用PKCS12_verify_mac验证密码.首先验证没有密码:

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

然后,如果有密码,请通过将其作为参数传递来验证它:

if( PKCS12_verify_mac(p12, password, -1) )
{
    printf("PKCS12 password matches.\n");
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

完整示例,编译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;
}
Run Code Online (Sandbox Code Playgroud)