Come rimuovere la password della chiave privata dal contenitore pkcs12?


40
  1. Ho estratto il certificato utilizzando il comando SSL / export di Chrome.
  2. Quindi lo ha fornito come input per openvpn - nella configurazione per openvpn:
    pkcs12 "path/to/pkcs12_container"
  3. Quando lo chiamo openvpn ~/openvp_configrichiede una password per la chiave privata (che ho inserito durante l'esportazione tramite Chrome):
    Enter Private Key Password:...
  4. Voglio rimuovere questa richiesta di password.

La domanda: come rimuovere la password per la chiave privata da pkcs12?

Cioè, crea il file pkcs12 che non richiede una password.

(sembra che l'ho già fatto in qualche modo un anno fa, e ora me ne sono dimenticato.)


lo script seguente fa questo (essenzialmente è zero0 risposta): gist.github.com/5nizza/7ae9cff0d43f33818a33 utilizzo:./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat

Risposte:


48

Può essere raggiunto con varie opensslchiamate.

  • PASSWORD è la tua password attuale
  • YourPKCSFile è il file che vuoi convertire
  • NewPKCSWithoutPassphraseFile è il file di destinazione per PKCS12 senza passphrase

Innanzitutto, estrai il certificato:

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

In secondo luogo, la chiave CA:

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

Ora, la chiave privata:

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

Ora rimuovi la passphrase:

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

Metti insieme le cose per il nuovo file PKCS:

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

E crea il nuovo file:

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

Ora hai un nuovo file di chiavi PKCS12 senza passphrase nella parte della chiave privata.


risposta fantastica! ..che ca-cert.cacos'è?
Ayrat,

@Ayrat: questa è la parte del certificato CA della chiave. - Ho un errore di battitura nella risposta, correzione ... - Sentiti libero di votare e accettare la risposta dopo averla provata :-)
zero0

2
-nodesviene ignorato quando -exportviene utilizzato, non è documentato per questo caso (vedere la pagina man di openssl, -nodesviene elencato solo durante l'esportazione da PKCS # 12 a PEM). La tua ultima chiamata mi richiede ancora una password di esportazione. E se premo semplicemente return, ottengo un file PKCS # 12 la cui password è una stringa vuota e non una senza password. Quando lo faccio openssl pkcs12 -in "NewPKCSWithoutPassphraseFile", mi chiede ancora una password di importazione. Posso solo premere return e funziona, ma se non ci fosse la password, non sarebbe nemmeno richiesto.
Mecki,

35

La soluzione più semplice che ho trovato è

Esporta in un file pem temporaneo

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

Converti pem in p12

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

Rimuovi certificato temporaneo

rm temp.pem

Non vedo un aspetto negativo di questo approccio.
Matt Beckman,

Alcuni strumenti richiedono una password. Ad esempio keytool -v -list -storetype pkcs12 -keystore unprotected.p12, emetterà un avviso e NON elencherà il certificato. Quindi potrebbe funzionare per OpenVPN, ma non per qualcos'altro.
lunedì

@mivk cosa intendi? Che alcuni strumenti richiedono una chiave protetta da password?
Koen.

1
Certo, ma la domanda è sulla rimozione della password, non sulle applicazioni che richiedono l'impostazione di una password.
Koen.

2
La tua soluzione non crea una PKCS # 12 senza password ma una con una password "" (stringa emtpy), che non è la stessa.
Mecki,

5

Questo può essere fatto facilmente in un solo passaggio senza file temporaneo:

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

Rispondi al prompt Import Password con la password. Rispondere alle richieste Export Passowrd con <CR>

Fatto.

Si noti che questo gestisce un numero qualsiasi di certificati intermedi che possono essere nel bundle ...

Consiglio vivamente di aver cura del file risultante; sarebbe una buona idea impostare umask prima su 377 (non unix: questo significa che solo il proprietario può leggere il file creato.) Suppongo che siano 2 passaggi, se la tua umask predefinita è permissiva ...


2

Ora, la chiave privata:

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

Rimuovi ora la passphrase:

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

I 2 passaggi possono essere sostituiti da

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

0

Nessuno di questi ha funzionato per me. Alla fine sono tornato al codice dotNet che ha funzionato per la prima volta.

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;
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.