Wie lade ich eine PKCS#12-Datei programmgesteuert in OpenSSL?

Lesezeit: 3 Minuten

Benutzeravatar von Jay
Jay

Wie können wir in einer auf OpenSSL basierenden SSL-Serveranwendung eine PKCS#12-Datei programmgesteuert laden?

Kann ich auch eine PKCS#12-Datei mit Zertifikat, Schlüssel und Zertifizierungsstellen in derselben Datei in OpenSSL laden?

Benutzeravatar von Mathias Brossard
Matthias Brosard

Ja, Sie können mit OpenSSL eine PKCS#12-Datei laden, die Zertifikat, Schlüssel und CAs in derselben Datei enthält.

  • Verwenden d2i_PKCS12_fp() oder d2i_PKCS12_bio() um die PKCS#12-Datei zu laden.
  • Optional verwenden PKCS12_verify_mac() um das Passwort zu verifizieren.
  • Verwenden PKCS12_parse() die Schlüssel, Zertifikat und CA-Kette für Sie entschlüsselt und extrahiert.

Aus openssl-1.0.0d/demos/pkcs12/pkread.c:

#include <stdio.h>
#include <stdlib.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/pkcs12.h>

/* Simple PKCS#12 file reader */

int main(int argc, char **argv)
{
    FILE *fp;
    EVP_PKEY *pkey;
    X509 *cert;
    STACK_OF(X509) *ca = NULL;
    PKCS12 *p12;
    int i;
    if (argc != 4) {
        fprintf(stderr, "Usage: pkread p12file password opfile\n");
        exit (1);
    }
    OpenSSL_add_all_algorithms();
    ERR_load_crypto_strings();
    if (!(fp = fopen(argv[1], "rb"))) {
        fprintf(stderr, "Error opening file %s\n", argv[1]);
        exit(1);
    }
    p12 = d2i_PKCS12_fp(fp, NULL);
    fclose (fp);
    if (!p12) {
        fprintf(stderr, "Error reading PKCS#12 file\n");
        ERR_print_errors_fp(stderr);
        exit (1);
    }
    if (!PKCS12_parse(p12, argv[2], &pkey, &cert, &ca)) {
        fprintf(stderr, "Error parsing PKCS#12 file\n");
        ERR_print_errors_fp(stderr);
        exit (1);
    }
    PKCS12_free(p12);
    if (!(fp = fopen(argv[3], "w"))) {
        fprintf(stderr, "Error opening file %s\n", argv[1]);
        exit(1);
    }
    if (pkey) {
        fprintf(fp, "***Private Key***\n");
        PEM_write_PrivateKey(fp, pkey, NULL, NULL, 0, NULL, NULL);
    }
    if (cert) {
        fprintf(fp, "***User Certificate***\n");
        PEM_write_X509_AUX(fp, cert);
    }
    if (ca && sk_X509_num(ca)) {
        fprintf(fp, "***Other Certificates***\n");
        for (i = 0; i < sk_X509_num(ca); i++) 
            PEM_write_X509_AUX(fp, sk_X509_value(ca, i));
    }

    sk_X509_pop_free(ca, X509_free);
    X509_free(cert);
    EVP_PKEY_free(pkey);

    fclose(fp);
    return 0;
}

  • @Mathias Der obige Code, den Sie angegeben haben, wird verwendet, um ein DER-Codierungs-P12-Zertifikat zu lesen. Gibt es eine API zum Lesen des PEM-codierten P12-Zertifikats?

    – Balamurugan

    5. April 2012 um 4:03 Uhr

  • @Balamurugan: Ich habe noch nie eine PEM-codierte PKCS # 12-Datei oder Software gesehen, die dies unterstützt.

    – Mathias Brossard

    9. April 2012 um 11:33 Uhr

  • Ich frage mich, ob Sie diese Antwort so erweitern können, dass sie die PKCS12-Struktur analysiert, ohne dass Speicher verloren geht (dh sie ist für die Verwendung in einem Programm mit langer Laufzeit geeignet). Insbesondere PKCS12_parse scheint etwa 4 kB zu verlieren.

    – Jean-Paul Calderone

    2. März 2013 um 17:29 Uhr


  • @Jean-PaulCalderone: Ich habe die zusätzlichen Bereinigungen von ca, cert und pkey hinzugefügt. Ich habe immer noch ein Leck mit OpenSSL 0.9.8, aber nicht mit 1.0.1.

    – Mathias Brossard

    3. April 2013 um 3:53 Uhr


Benutzeravatar von Rune Torgersen
Rune Torgersen

Seien Sie gewarnt, dass der Code die Zertifikate als vertrauenswürdige Zertifikate (verschlüsselt) schreibt. Wenn Sie unverschlüsselte Zertifikate wünschen, ändern Sie die Aufrufe von PEM_write_X509_AUX() in PEM_write_X509().

  • Dieser Text sollte eigentlich in den Kommentaren stehen.

    – Mathias

    4. Januar 2017 um 11:20 Uhr

  • Dies war mein Problem, da die Tags BEGIN TRUSTED CERTIFICATE anstelle von Just BEGIN CERTIFICATE waren

    – Jim

    31. März 2017 um 18:57 Uhr

Benutzeravatar von Kerrek SB
Kerrek SB

Versuchen man SSL, das Ihnen eine Liste von OpenSSL-Funktionen gibt. Etwas wie SSL_load_client_CA_file könnte Ihren Bedürfnissen entsprechen; es hängt davon ab, ob sich das Zertifikat in einer Datei auf der Festplatte oder bereits im Speicher befindet. Es gibt viele Hilfsfunktionen, eine davon wird den Zweck erfüllen. Schau auch mal rein man PEM für PEM-Behandlungsroutinen.

Bearbeiten: Hm, vielleicht eine Kombination aus d2i_PKCS12_fp und PKCS12_parse (beides erhältlich ab <openssl/pkcs12.h>) können Sie ein Zertifikat aus einer Datei lesen und analysieren.

1433340cookie-checkWie lade ich eine PKCS#12-Datei programmgesteuert in OpenSSL?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy