Jak usunąć hasło klucza prywatnego z kontenera pkcs12?

40
  1. Wyodrębniłem certyfikat za pomocą polecenia SSL / eksportu Chrome.
  2. Następnie podał go jako dane wejściowe do openvpn - w konfiguracji dla openvpn:
    pkcs12 "path/to/pkcs12_container"
  3. Podczas dzwonienia openvpn ~/openvp_configprosi o hasło do klucza prywatnego (który wprowadziłem podczas eksportowania za pomocą Chrome):
    Enter Private Key Password:...
  4. Chcę usunąć to żądanie hasła.

Pytanie: jak usunąć hasło do klucza prywatnego z pkcs12?

To znaczy, stwórz plik pkcs12, który nie wymaga hasła.

(wydaje się, że już jakoś to zrobiłem rok temu, a teraz zapomniałem.damn.)

Ayrat
źródło
robi to następujący skrypt (zasadniczo jest to odpowiedź zero0): użycie gist.github.com/5nizza/7ae9cff0d43f33818a33 :./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat

Odpowiedzi:

48

Można to osiągnąć za pomocą różnych opensslpołączeń.

  • HASŁO to twoje aktualne hasło
  • Twój plik PKCSFile to plik, który chcesz przekonwertować
  • NowyPKCSWithoutPassphraseFile to plik docelowy dla PKCS12 bez hasła

Najpierw wypakuj certyfikat:

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

Po drugie, klucz CA:

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

Teraz klucz prywatny:

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

Teraz usuń hasło:

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

Złóż wszystko razem dla nowego pliku PKCS:

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

I utwórz nowy plik:

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

Teraz masz nowy plik klucza PKCS12 bez hasła w części klucza prywatnego.

zero
źródło
świetna odpowiedź! .. co to jest ca-cert.ca?
Ayrat
@Ayrat: To jest część certyfikatu CA twojego klucza. - Mam literówkę w odpowiedzi, poprawiam ... - Zachęcam do głosowania i zaakceptowania odpowiedzi po wypróbowaniu :-)
zero0
2
-nodesjest ignorowany, gdy -exportjest używany, nie jest udokumentowany w tym przypadku (patrz strona man openssl, -nodesjest wymieniony tylko podczas eksportu z PKCS # 12 do PEM). Ostatnie połączenie nadal monituje mnie o hasło eksportu. A jeśli właśnie wrócę return, otrzymam plik PKCS # 12, którego hasło jest pustym ciągiem, a nie jednym bez hasła. Gdy to zrobię openssl pkcs12 -in "NewPKCSWithoutPassphraseFile", nadal monituje mnie o hasło do importu. Mogę po prostu nacisnąć Return i to działa, ale gdyby nie było hasła, nie byłoby nawet wyświetlane.
Mecki
35

Najprostszym rozwiązaniem , jakie znalazłem, jest

Eksportuj do tymczasowego pliku pem

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

Konwertuj pem z powrotem na p12

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

Usuń tymczasowy certyfikat

rm temp.pem
Koen
źródło
Nie widzę wad tego podejścia.
Matt Beckman
Niektóre narzędzia wymagają hasła. Na przykład keytool -v -list -storetype pkcs12 -keystore unprotected.p12wyemituje ostrzeżenie i NIE wyświetli certyfikatu. Może więc działać dla OpenVPN, ale nie dla czegoś innego.
mivk
@mivk co masz na myśli? Czy niektóre narzędzia wymagają klucza chronionego hasłem?
Koen.
1
Jasne, ale pytanie dotyczy usunięcia hasła, a nie aplikacji wymagających ustawienia hasła.
Koen.
2
Twoje rozwiązanie nie tworzy PKCS # 12 bez hasła, ale z hasłem „” (ciąg pusty), który nie jest taki sam.
Mecki
5

Można to łatwo zrobić w jednym kroku bez pliku tymczasowego:

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

Odpowiedz na pytanie Importuj hasło, podając hasło. Odpowiedz na polecenia Export Passowrd, naciskając <CR>

Gotowy.

Pamiętaj, że obsługuje to dowolną liczbę certyfikatów pośrednich, które mogą znajdować się w pakiecie ...

Zdecydowanie zalecam ostrożność z wynikowym plikiem; dobrym pomysłem byłoby ustawienie najpierw umask na 377 (non-unix: oznacza to, że tylko właściciel może odczytać utworzony plik). Przypuszczam, że to 2 kroki, jeśli domyślny umask jest dozwolony ...

tlhackque
źródło
2

Teraz klucz prywatny:

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

Usuń teraz hasło:

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

Te 2 kroki można zastąpić

openssl pkcs12 -nocerts -in "YourPKCSFile" -out private.key -nodes
kuang
źródło
0

Żadne z tych nie działało dla mnie. W końcu wróciłem do kodu dotNet, który zadziałał za pierwszym razem.

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
źródło