Ich habe ein .pxf-Zertifikat (AFAIK PKCS#12). Wie kann ich ein bestimmtes Passwort für dieses Zertifikat mit der openssl-C-API bestätigen?
Wie verifiziere ich das Passwort eines pkcs#12-Zertifikats (.PXF) mit der openssl-C-API?
Tilo Prütz
Einzeln
Ein Ansatz, um Antworten wie diese zu finden, besteht darin, ein OpenSSL-Dienstprogramm zu finden, das die gleiche Funktionalität wie das bietet, was Sie versuchen. In diesem Fall können Sie die verwenden pkcs12 Dienstprogramm, das mit OpenSSL geliefert wird, um das Passwort zu überprüfen.
Der Befehl zum Überprüfen einer PFX-Datei lautet wie folgt:
openssl pkcs12 -in mypfx.pfx -noout
Mit diesen Informationen können Sie es sich dann ansehen Quellcode ({openssl_src}/apps/pkcs12.c
) um zu sehen, wie sie es tun.
Der Quellcode zeigt, dass es aufruft PKCS12_verify_mac
um das Passwort zu verifizieren. Überprüfen Sie zuerst, ob kein Passwort vorhanden ist:
if( PKCS12_verify_mac(p12, NULL, 0) )
{
printf("PKCS12 has no password.\n");
}
Und wenn es dann ein Passwort gibt, überprüfen Sie es, indem Sie es als Argument übergeben:
if( PKCS12_verify_mac(p12, password, -1) )
{
printf("PKCS12 password matches.\n");
}
OpenSSL hat auch Demos für die Arbeit mit PKCS12 in openssl/demos/pkcs12
. Das pkread.c
Demo bietet ein Beispiel für das Parsen einer PFX-Datei mit einem Passwort.
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);
}
Vollständiges Beispiel, kompiliert mit 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;
}
Verwenden PKCS12_verify_mac()
. z.B.
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
}
Sehen Sie sich diese Antwort an und beachten Sie, dass das Passwort korrekt war, wenn PKCS12_parse 1 zurückgibt: stackoverflow.com/questions/3549459/…
– individuell
13. Januar 2011 um 18:55 Uhr
Versuchen Sie auch, das mit OpenSSL gelieferte Dienstprogramm pkcs12 zu verwenden (openssl.org/docs/apps/pkcs12.html). Wenn das geht, schau mal
<openssl source>/apps/pkcs12.c
um zu sehen, wie sie es tun.– individuell
13. Januar 2011 um 18:57 Uhr
@indiv: Poste deinen zweiten Kommentar als Antwort und ich werde ihn akzeptieren :).
–Tilo Prütz
21. Februar 2011 um 9:48 Uhr
Gut. Ich hatte gehofft, jemand würde vorbeikommen und eine bessere Antwort als einen Link posten, aber diese OpenSSL-Fragen erhalten hier einfach nicht viele Seitenaufrufe.
– individuell
21. Februar 2011 um 16:52 Uhr