2011-01-13 7 views
3

私は.pxf(AFAIK PKCS#12)証明書を持っています。 openssl C APIを使用してこの証明書のパスワードを確認するにはどうすればよいですか?openssl C APIを使用してpkcs#12証明書(.PXF)のパスワードを確認する方法は?

+1

PKCS12_parseが1を返す場合、そのパスワードが正しかったことを指摘し、この回答を参照してください。http://stackoverflow.com/questions/3549459/extracting-client-certificate-private-key-from-p12-file – indiv

+1

また、OpenSSL(http://www.openssl.org/docs/apps/pkcs12.html)に付属のpkcs12ユーティリティを使用してみてください。それがうまくいくなら、 '/apps/pkcs12.c'を見て、どのように動作するのか見てみましょう。 – indiv

+0

@indiv:2番目のコメントを回答として投稿し、私はそれを受け入れます:)。 –

答えて

2

このような答えを見つける1つの方法は、実行しようとしているのと同じ機能を実行するOpenSSLユーティリティを見つけることです。この場合、OpenSSLに付属のpkcs12ユーティリティを使用してパスワードを確認することができます。

PFXファイルを検証するコマンドは以下の通りです:

openssl pkcs12 -in mypfx.pfx -noout 

その情報を使用すると、その後、彼らはそれを行う方法を確認するために、そのsource code{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がまた openssl/demos/pkcs12にPKCS12を操作するためのデモを持って

pkread.cデモには、pfxファイルをパスワードで解析するための例があります。 gcc -std=c99 verifypfx.c -o verifypfx -lcryptoでコンパイルさ

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); 
} 

全例、:

#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; 
} 
+0

リンクが機能しなくなりました。 – sbose

+0

OPには「openssl C APIの使用」が明確に尋ねられました。どのように "pkcs12ユーティリティを使用する"(どのリンクも壊れている)の答えは?また、「そこを見て、それがどのように動作するか」へのリンクを提供することも、答えではありません。 – FractalSpace

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 
} 
関連する問題