pkcs12 "path/to/pkcs12_container"
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:...
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é.)
Il peut être réalisé par divers appels openssl
.
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.
La solution la plus simple que j'ai trouvée est
openssl pkcs12 -in protected.p12 -nodes -out temp.pem
# -> Enter password
openssl pkcs12 -export -in temp.pem -out unprotected.p12
# -> Just press [return] twice for no password
rm temp.pem
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 ...
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
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;
}
}