it-swarm.com.de

Wie entferne ich das Passwort für den privaten Schlüssel aus dem pkcs12-Container?

  1. Ich habe das Zertifikat mit dem SSL/Export-Befehl von Chrome extrahiert.
  2. Dann als Eingabe für openvpn bereitgestellt - in der Konfiguration für openvpn:
    pkcs12 "path/to/pkcs12_container"
  3. Beim Aufruf von openvpn ~/openvp_config fragt nach einem Passwort für den privaten Schlüssel (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?

Erstellen Sie also eine pkcs12-Datei, für die kein Kennwort erforderlich ist.

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

41
Ayrat

Dies kann durch verschiedene Aufrufe von openssl erreicht werden.

  • PASSWORT ist Ihr aktuelles Passwort
  • YourPKCSFile ist die Datei, die Sie konvertieren möchten
  • NewPKCSWithoutPassphraseFile ist die Zieldatei für 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 erstellen Sie 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 für den privaten Schlüsselteil.

51
zero0

Die einfachste Lösung habe ich gefunden ist

In temporäre PEM-Datei exportieren

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

Konvertieren Sie 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
38
Koen.

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

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

Beantworten Sie die Eingabeaufforderung zum Importieren des Passworts mit dem Passwort. Beantworten Sie die Export Passowrd-Eingabeaufforderungen mit <CR>

Erledigt.

Beachten Sie, dass dies eine beliebige Anzahl von Zwischenzertifikaten behandelt, die möglicherweise im Bundle enthalten sind ...

Ich empfehle dringend, mit der resultierenden Datei vorsichtig umzugehen. 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, das sind 2 Schritte, wenn Ihre Standard-umask zulässig ist ...

5
tlhackque

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
2
kuang

Nichts davon hat bei mir funktioniert. Am Ende kehrte ich zum 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;
    }
}
0
Nick van Esch