Wie Private Key Password aus pkcs12 Container entfernen?

40
  1. Ich habe das Zertifikat mit dem Chrome-Befehl SSL / export extrahiert.
  2. Stellen Sie es dann als Eingabe für openvpn bereit - in der Konfiguration für openvpn:
    pkcs12 "path/to/pkcs12_container"
  3. Beim Aufruf openvpn ~/openvp_configwird nach einem Passwort für den privaten Schlüssel gefragt (das ich beim Exportieren mit Chrome eingegeben habe):
    Enter Private Key Password:...
  4. Ich möchte diese Passwortanfrage entfernen.

Die Frage: Wie entferne ich das Passwort für den privaten Schlüssel von pkcs12?

Das heißt, erstellen Sie eine pkcs12-Datei, für die kein Kennwort erforderlich ist.

(Anscheinend habe ich das schon vor einem Jahr gemacht und jetzt vergessen. Verdammt.)

Ayrat
quelle
Das folgende Skript erledigt dies (im Wesentlichen ist es eine Antwort von Null): gist.github.com/5nizza/7ae9cff0d43f33818a33 Verwendung:./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat

Antworten:

48

Es kann durch verschiedene opensslAufrufe erreicht werden.

  • PASSWORT ist Ihr aktuelles Passwort
  • YourPKCSFile ist die Datei, die Sie konvertieren möchten
  • NewPKCSWithoutPassphraseFile ist die Zieldatei für das PKCS12 ohne Passphrase

Extrahieren Sie zuerst das Zertifikat:

$ openssl pkcs12 -clcerts -nokeys -in "YourPKCSFile" \
      -out certificate.crt -password pass:PASSWORD -passin pass:PASSWORD

Zweitens der CA-Schlüssel:

$ openssl pkcs12 -cacerts -nokeys -in "YourPKCSFile" \
      -out ca-cert.ca -password pass:PASSWORD -passin pass:PASSWORD

Nun der private Schlüssel:

$ openssl pkcs12 -nocerts -in "YourPKCSFile" \
      -out private.key -password pass:PASSWORD -passin pass:PASSWORD \
      -passout pass:TemporaryPassword

Entfernen Sie nun die Passphrase:

$ openssl rsa -in private.key -out "NewKeyFile.key" \
      -passin pass:TemporaryPassword

Stellen Sie die Dinge für die neue PKCS-Datei zusammen:

$ cat "NewKeyFile.key"  \
      "certificate.crt" \
      "ca-cert.ca" > PEM.pem

Und erstelle die neue Datei:

$ openssl pkcs12 -export -nodes -CAfile ca-cert.ca \
      -in PEM.pem -out "NewPKCSWithoutPassphraseFile"

Jetzt haben Sie eine neue PKCS12-Schlüsseldatei ohne Passphrase auf dem privaten Schlüsselteil.

zero0
quelle
tolle Antwort! ..was ist ca-cert.ca?
Ayrat
@Ayrat: Dies ist das CA-Zertifikat Ihres Schlüssels. - Ich habe einen Tippfehler in der Antwort, Korrekturen ... - zögern Sie nicht zu stimmen und akzeptieren Sie die Antwort, nachdem Sie es versucht haben :-)
zero0
2
-nodeswird bei -exportVerwendung ignoriert, ist für diesen Fall nicht dokumentiert (siehe openssl-Manpage, -nodeswird nur beim Export von PKCS # 12 nach PEM aufgelistet). Ihr letzter Anruf fordert mich immer noch zur Eingabe eines Exportkennworts auf. Und wenn ich nur die Eingabetaste drücke, erhalte ich eine PKCS # 12-Datei, deren Kennwort eine leere Zeichenfolge ist und keine ohne Kennwort. Wenn ich das dann mache openssl pkcs12 -in "NewPKCSWithoutPassphraseFile", fragt es mich immer noch nach einem Import-Passwort. Ich kann einfach die Eingabetaste drücken und das funktioniert, aber wenn es kein Passwort gäbe, würde es nicht einmal dazu auffordern.
Mecki
35

Die einfachste Lösung, die ich gefunden habe, ist

In temporäre PEM-Datei exportieren

openssl pkcs12 -in protected.p12 -nodes -out temp.pem
#  -> Enter password

Konvertiere pem zurück zu p12

openssl pkcs12 -export -in temp.pem  -out unprotected.p12
# -> Just press [return] twice for no password

Temporäres Zertifikat entfernen

rm temp.pem
Koen.
quelle
Ich sehe keinen Nachteil bei diesem Ansatz.
Matt Beckman
Einige Tools erfordern ein Passwort. Beispielsweise keytool -v -list -storetype pkcs12 -keystore unprotected.p12wird eine Warnung ausgegeben und das Zertifikat NICHT aufgelistet. So kann es für OpenVPN arbeiten, aber nicht für etwas anderes.
18.
@mivk was meinst du? Dass für einige Tools ein passwortgeschützter Schlüssel erforderlich ist?
Koen.
1
Sicher, aber die Frage bezieht sich auf das Entfernen des Kennworts und nicht auf Anwendungen, für die ein Kennwort festgelegt werden muss.
Koen.
2
Ihre Lösung erstellt kein PKCS # 12 ohne Kennwort, sondern ein Kennwort mit dem Wert "" (leere Zeichenfolge), der nicht identisch ist.
Mecki
5

Dies kann problemlos in einem Schritt ohne temporäre Datei durchgeführt werden:

openssl pkcs12 -in "PKCSFile" -nodes | openssl pkcs12 -export -out "PKCSFile-Nopass"

Beantworten Sie die Aufforderung zum Importieren des Kennworts mit dem Kennwort. Beantworten Sie die Eingabeaufforderungen zum Exportieren von Passwörtern mit <CR>

Getan.

Beachten Sie, dass dies eine beliebige Anzahl von Zwischenzertifikaten behandelt, die im Bundle enthalten sein können ...

Ich empfehle dringend, mit der resultierenden Datei vorsichtig zu sein. Es wäre eine gute Idee, umask zuerst auf 377 zu setzen (Nicht-Unix: Dies bedeutet, dass nur der Eigentümer die erstellte Datei lesen kann.) Ich nehme an, dass dies 2 Schritte sind, wenn Ihre Standard-Umask zulässig ist ...

tlhackque
quelle
2

Nun der private Schlüssel:

openssl pkcs12 -nocerts -in "YourPKCSFile" -out private.key -password pass:PASSWORD -passin pass:PASSWORD -passout pass:TemporaryPassword

Entfernen Sie jetzt die Passphrase:

openssl rsa -in private.key -out "NewKeyFile.key" -passin pass:TemporaryPassword

Die 2 Schritte können durch ersetzt werden

openssl pkcs12 -nocerts -in "YourPKCSFile" -out private.key -nodes
kuang
quelle
0

Nichts davon hat bei mir funktioniert. Am Ende kehrte ich zu DotNet-Code zurück, der beim ersten Mal funktionierte.

class Script
{
    static public void Main(string[] args)
    {
                if (args.Length < 3 || args.Contains("/?"))
                {
                    MainHelp(args);
                    return;
                }
       string _infile = args[0],
                        _outfile = args[2];
                string _password = args[1], _outpassword = (args.Length > 3) ? args[3] : "";
                Console.WriteLine(String.Format("{0} -> {1} with ({2} -> {3})", _infile, _outfile, _password, _outpassword));
                System.Security.Cryptography.X509Certificates.X509Certificate2 cert = null;
                Console.WriteLine(String.Format("Load {0} with {2}", _infile, _outfile, _password, _outpassword));
                cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(_infile, _password, X509KeyStorageFlags.Exportable);
                Console.WriteLine(String.Format("Export {1} with {3}", _infile, _outfile, _password, _outpassword));
                System.IO.File.WriteAllBytes(_outfile, cert.Export(System.Security.Cryptography.X509Certificates.X509ContentType.Pfx, _outpassword));
                Console.WriteLine(String.Format("Export complete", _infile, _outfile, _password, _outpassword));
    }

     static public void MainHelp(string[] args)
    {
            Console.WriteLine("Usage pfxremovepwd [inpfx] [inpwd] [outpfx] [optional outpwd]");
            return;
    }
}
Nick van Esch
quelle