Ich generiere den Export einiger pkcs # 12-Dateien zu Testzwecken. Diese Dateien werden in der Produktion nicht verwendet und sind während des automatisierten Tests nur temporär vorhanden.
Ich verwende den folgenden Befehl:
openssl pkcs12 -export -nodes -out bundle.pfx -inkey mykey.key -in certificate.crt -certfile ca-cert.crt
Warum besteht es auf einem Exportkennwort, wenn ich -nodes
eingegeben habe?
Meine OpenSSL-Version ist OpenSSL 1.0.1f 6 Jan 2014
auf Ubuntu Server 14.10 64-Bit.
Wenn Sie im interaktiven Modus zur Eingabe eines Kennworts aufgefordert werden, drücken Sie einfach die Eingabetaste. Es wird kein Kennwort festgelegt.
Wenn Sie dies automatisieren möchten (z. B. als ansprechbarer Befehl), verwenden Sie das Argument -passout
. Sie erwartet, dass der Parameter in der Form pass:mypassword
vorliegt. Da wir kein Passwort haben wollen:
openssl pkcs12 -export -nodes -out bundle.pfx -inkey mykey.key -in certificate.crt -certfile ca-cert.crt -passout pass:
tl; dr Was Sie zu tun versuchen, ist mit dem OpenSSL-Befehlszeilenprogramm einfach nicht möglich. Dies kann nur programmgesteuert mit libcrypto, der Kryptobibliothek von OpenSSL, durchgeführt werden.
-nodes
bedeutet "privaten Schlüssel nicht verschlüsseln", aber in einer PKCS # 12-Datei werden die Zertifikate ebenfalls verschlüsselt, sodass Sie selbst mit -nodes
ein Exportkennwort benötigen.
Siehe die Dokumentation von -descert
, in der es heißt:
Verschlüsseln Sie das Zertifikat mit Triple DES. Dadurch wird möglicherweise die PKCS # 12-Datei von einigen "Export Grade" -Software nicht lesbar. Der private Schlüssel lautet standardmäßig verschlüsselt mit Triple DES und das Zertifikat verwendet 40-Bit-RC2.
Wenn Sie diese Option nicht verwenden, werden die Zertifikate daher mit RC2 verschlüsselt. Sie können die Algorithmen für Schlüssel oder Zertifikate mit den Optionen -keypbe
und -certpbe
ändern.
Auch für openssl pkcs12
ist die Option -nodes
nur im Abschnitt aufgeführt:
Die Optionen zum Analysieren einer PKCS12-Datei lauten wie folgt:
Aber Sie analysieren eine solche Datei nicht, Sie erstellen sie und wenn Sie sich die Datei ansehen
Die Optionen für die Erstellung der PKCS12-Datei lauten wie folgt:
die Option -nodes
ist nicht einmal aufgeführt.
Wenn Sie bei der Eingabe eines Kennworts die Eingabetaste drücken, bedeutet dies ebenfalls nicht "kein Kennwort", sondern "leeres Kennwort" (Ihr Kennwort ist eine leere Zeichenfolge). Dies ist zulässig. Der Grund, warum dies wie kein Passwort funktioniert, besteht in einigen Fällen darin, dass einige Software versucht, PKCS # 12-Dateien zuerst mit einem leeren Zeichenfolge-Passwort zu lesen, und nur, wenn dies fehlschlägt. Fordern Sie den Benutzer zur Eingabe eines tatsächlichen Passworts auf. In diesen Fällen wird der Benutzer nie dazu aufgefordert, so zu tun, als sei "kein Passwort" festgelegt.
Dies kann zu Problemen in macOS und iOS führen, da Apple davon ausgeht, dass für PKCS # 12 immer ein Kennwort festgelegt ist und Sie kein "leeres Kennwort" eingeben können. Wenn eine Datei ein leeres Kennwort enthält, ist der Import nicht möglich es auf diesen Systemen. Firefox hatte auch dieses Problem von Anfang an, aber es wurde vor 13 Jahren behoben .
Beim Lesen einer PKCS # 12-Datei versucht OpenSSL selbst, nur durch Erraten zwischen "no password" und "empty password" zu unterscheiden. Hier ist der Originalcode aus dem Projekt:
/* If we enter empty password try no password first */
if(!mpass[0] && PKCS12_verify_mac(p12, NULL, 0)) {
/* If mac and crypto pass the same set it to NULL too */
if(!twopass) cpass = NULL;
} else if (!PKCS12_verify_mac(p12, mpass, -1)) {
BIO_printf (bio_err, "Mac verify error: invalid password?\n");
ERR_print_errors (bio_err);
goto end;
}
Wenn NULL
das erste Mal als Kennwort übergeben wird, wird beim zweiten Mal die leere Zeichenfolge für das Kennwort analysiert. Lassen Sie uns nun den Code betrachten, wenn Sie eine P12-Datei erstellen:
p12 = PKCS12_create(cpass, name, key, ucert, certs,
key_pbe, cert_pbe, iter, -1, keytype);
Theoretisch würde dieser Aufruf eine PKCS # 12-Datei ohne Kennwort erstellen, wenn und nur wenncpass
NULL
ist. Wenn dieser Aufruf erfolgt, kann es jedoch nicht NULL
sein, denn wenn Sie dem Codepfad von Anfang an folgen Um den oben genannten Aufruf auszuführen, gibt es keinen Codepfad, der dazu führen würde, dass cpass
am Ende NULL
ist.
if(!cpass) {
if(export_cert) cpass = passout;
else cpass = passin;
}
if(cpass) {
mpass = cpass;
noprompt = 1;
} else {
cpass = pass;
mpass = macpass;
}
Falls cpass
noch NULL
an der letzten if
war, wird es auf pass
gesetzt und pass
lautet:
char pass[50], macpass[50];
Dies ist eine statische statische Variable. Wenn sie in einem Zeiger gespeichert wird, kann dieser Zeiger nicht NULL
sein. Es gibt keinen anderen Code, der cpass
je einen anderen Wert zuweist, daher kann cpass
eine leere Zeichenfolge sein, aber es kann sich sicher nicht um NULL
handeln, und daher keine PKCS # 12-Datei, die OpenSSL je als Befehlszeile in der Befehlszeile erstellt. Es hat möglicherweise ein leeres Passwort, aber es hat sicherlich ein Passwort.