Comment supprimer Private Key Password du conteneur pkcs12?

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

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

En d’autres termes, créez un fichier pkcs12 qui ne nécessite pas de mot de passe.

(Il semble que je l’ai déjà fait il ya un an et que je l’oublie maintenant.)

Ayrat
la source
le script suivant effectue cette opération (il s'agit essentiellement d'une réponse nulle): gist.github.com/5nizza/7ae9cff0d43f33818a33 utilisation:./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat

Réponses:

48

Cela peut être réalisé par divers opensslappels.

  • MOT DE PASSE est votre mot de passe actuel
  • YourPKCSFile est le fichier que vous voulez convertir
  • NewPKCSWithoutPassphraseFile est le fichier cible du 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

Rassemblez les éléments 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 avez maintenant un nouveau fichier de clé PKCS12 sans phrase secrète sur la partie clé privée.

zéro0
la source
réponse géniale! ..Quelle est ca-cert.ca?
Ayrat
@Ayrat: il s'agit de la partie certificat de votre autorité de certification. - J'ai une faute de frappe dans la réponse, corrigeant ... - n'hésitez pas à voter et accepter la réponse après l'avoir essayée :-)
zero0
2
-nodesest ignoré lorsqu’il -exportest utilisé, il n’est pas documenté pour ce cas (voir la page de manuel openssl, il -nodesn’est répertorié que lors de l’exportation de PKCS # 12 vers PEM). Votre dernier appel me demande toujours un mot de passe d'exportation. Et si je clique simplement sur retour, je reçois un fichier PKCS # 12 dont le mot de passe est une chaîne vide et non pas sans mot de passe. Quand je le fais alors, openssl pkcs12 -in "NewPKCSWithoutPassphraseFile"il me demande toujours un mot de passe d'importation. Je peux simplement appuyer sur retour et cela fonctionne, mais s'il n'y avait pas de mot de passe, il ne serait même pas invité.
Mecki
35

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 vers p12

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

Supprimer le certificat temporaire

rm temp.pem
Koen.
la source
Je ne vois pas d'inconvénient à cette approche.
Matt Beckman
Certains outils nécessitent un mot de passe. Par exemple keytool -v -list -storetype pkcs12 -keystore unprotected.p12, émettra un avertissement et ne listera PAS le certificat. Cela peut donc fonctionner pour OpenVPN, mais pas pour autre chose.
mardi
@mivk qu'est-ce que tu veux dire? Que certains outils nécessitent une clé protégée par mot de passe?
Koen.
1
Bien sûr, mais la question porte sur la suppression du mot de passe, pas sur les applications nécessitant la définition d'un mot de passe.
Koen.
2
Votre solution ne crée pas un PKCS # 12 avec un mot de passe, mais avec un mot de passe qui est "" (chaîne vide), ce qui n’est pas le même.
Mecki
5

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

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

Répondez à l'invite Importer le mot de passe avec le mot de passe. Répondez aux invites du mot de passe d'exportation avec <CR>

Terminé.

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

Je recommande fortement de prendre soin du fichier résultant; ce serait une bonne idée de régler umask sur 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 ...

tlhackque
la source
2

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
kuang
la source
0

Aucun de ceux-ci n'a fonctionné pour moi. En fin de compte, je suis revenu au code dotNet qui fonctionnait du premier coup.

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
la source