web-dev-qa-db-fra.com

Comment supprimer le mot de passe de la clé privée du conteneur pkcs12?

  1. J'ai extrait le certificat à l'aide de la commande SSL/export de Chrome.
  2. Puis il l'a fourni comme entrée à openvpn - dans la configuration pour openvpn:
    pkcs12 "path/to/pkcs12_container"
  3. Lors de l'appel openvpn ~/openvp_config il demande un mot de passe pour la clé privée (que j'ai entré lors de l'exportation avec Chrome):
    Enter Private Key Password:...
  4. Je souhaite supprimer cette demande de mot de passe.

La question: comment supprimer le mot de passe de la clé privée de pkcs12?

Autrement dit, créez un fichier pkcs12 qui ne nécessite pas de mot de passe.

(Il semble que je l'ai déjà fait il y a un an, et maintenant je l'ai oublié.)

41
Ayrat

Il peut être réalisé par divers appels openssl.

  • MOT DE PASSE est votre mot de passe actuel
  • VotrePKCSFile est le fichier que vous souhaitez convertir
  • NewPKCSWithoutPassphraseFile est le fichier cible pour le PKCS12 sans phrase secrète

Tout d'abord, extrayez le certificat:

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

Deuxièmement, la clé CA:

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

Maintenant, la clé privée:

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

Maintenant, supprimez la phrase secrète:

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

Mettez les choses ensemble pour le nouveau fichier PKCS:

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

Et créez le nouveau fichier:

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

Vous disposez maintenant d'un nouveau fichier de clé PKCS12 sans phrase secrète sur la partie clé privée.

51
zero0

La solution la plus simple que j'ai trouvée est

Exporter vers un fichier pem temporaire

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

Convertir pem en p12

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

Supprimer le certificat temporaire

rm temp.pem
38
Koen.

Cela peut facilement être fait en une seule étape sans fichier temporaire:

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

Répondez à l'invite d'importation de mot de passe avec le mot de passe. Répondez aux invites Export Passowrd avec <CR>

Terminé.

Notez que cela gère n'importe quel nombre de certificats intermédiaires qui peuvent être dans le bundle ...

Je recommande fortement de faire attention au fichier résultant; ce serait une bonne idée de mettre umask à 377 en premier (non-unix: cela signifie que seul le propriétaire peut lire le fichier créé.) Je suppose que c'est 2 étapes, si votre umask par défaut est permissif ...

5
tlhackque

Maintenant, la clé privée:

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

Supprimez maintenant la phrase secrète:

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

Les 2 étapes peuvent être remplacées par

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

Rien de tout cela n'a fonctionné pour moi. À la fin, je suis revenu au code dotNet qui a fonctionné la première fois.

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