wake-up-neo.com

Eine PKCS # 12-Datei ohne Exportkennwort exportieren?

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.

36
F21

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:
46
F21

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.

Detaillierte antwort:

-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 wenncpassNULL 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.

0
Mecki