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?
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?
Matthias Brosard
Ja, Sie können mit OpenSSL eine PKCS#12-Datei laden, die Zertifikat, Schlüssel und CAs in derselben Datei enthält.
d2i_PKCS12_fp()
oder d2i_PKCS12_bio()
um die PKCS#12-Datei zu laden.PKCS12_verify_mac()
um das Passwort zu verifizieren.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
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
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.