¿Cómo eliminar la contraseña de clave privada del contenedor pkcs12?

40
  1. Extraje el certificado utilizando el comando SSL / export de Chrome.
  2. Luego lo proporcionó como entrada para openvpn, en la configuración de openvpn:
    pkcs12 "path/to/pkcs12_container"
  3. Al llamar openvpn ~/openvp_config, solicita una contraseña para la clave privada (que ingresé al exportar usando Chrome):
    Enter Private Key Password:...
  4. Quiero eliminar esta solicitud de contraseña.

La pregunta: ¿cómo eliminar la contraseña para la clave privada de pkcs12?

Es decir, cree un archivo pkcs12 que no requiera una contraseña.

(Parece que de alguna manera ya hice esto hace un año, y ahora lo olvidé. Maldita sea).

Ayrat
fuente
el siguiente script hace esto (esencialmente es cero respuesta): gist.github.com/5nizza/7ae9cff0d43f33818a33 uso:./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat

Respuestas:

48

Se puede lograr mediante varias opensslllamadas.

  • CONTRASEÑA es su contraseña actual
  • YourPKCSFile es el archivo que desea convertir
  • NewPKCSWithoutPassphraseFile es el archivo de destino para el PKCS12 sin frase de contraseña

Primero, extraiga el certificado:

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

En segundo lugar, la clave CA:

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

Ahora, la clave privada:

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

Ahora elimine la frase de contraseña:

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

Arme las cosas para el nuevo archivo PKCS:

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

Y crea el nuevo archivo:

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

Ahora tiene un nuevo archivo de clave PKCS12 sin frase de contraseña en la parte de clave privada.

cero0
fuente
increíble respuesta! ¿ ca-cert.caQué es ?
Ayrat
@Ayrat: esta es la parte del certificado de CA de su clave. - Tengo un error tipográfico en la respuesta, corrigiendo ... - siéntase libre de votar y aceptar la respuesta después de haberlo intentado :-)
cero 0
2
-nodesse ignora cuando -exportse usa, no está documentado para este caso (consulte la página de manual de openssl, -nodessolo aparece al exportar desde PKCS # 12 a PEM). Su última llamada aún me solicita una contraseña de exportación. Y si solo presiono regresar, obtengo un archivo PKCS # 12 cuya contraseña es una cadena vacía y no una sin contraseña. Cuando lo hago openssl pkcs12 -in "NewPKCSWithoutPassphraseFile", todavía me pide una contraseña de importación. Solo puedo presionar regresar y eso funciona, pero si no hubiera una contraseña, ni siquiera se solicitaría.
Mecki
35

La solución más simple que he encontrado es

Exportar a archivo pem temporal

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

Convertir pem de nuevo a p12

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

Eliminar certificado temporal

rm temp.pem
Koen
fuente
No veo un inconveniente en este enfoque.
Matt Beckman el
Algunas herramientas requieren una contraseña. Por ejemplo keytool -v -list -storetype pkcs12 -keystore unprotected.p12, emitirá una advertencia y NO mostrará el certificado. Por lo tanto, puede funcionar para OpenVPN, pero no para otra cosa.
mivk
@mivk, ¿qué quieres decir? ¿Que algunas herramientas requieren una clave protegida por contraseña?
Koen
1
Claro, pero la pregunta es sobre eliminar la contraseña, no sobre las aplicaciones que requieren que se establezca una contraseña.
Koen
2
Su solución no crea una PKCS # 12 sin contraseña, sino una con una contraseña que sea "" (cadena de caracteres), que no es la misma.
Mecki
5

Esto se puede hacer fácilmente en un solo paso sin archivo temporal:

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

Responda el mensaje Importar contraseña con la contraseña. Responda las solicitudes Export Passowrd con <CR>

Hecho.

Tenga en cuenta que esto maneja cualquier número de certificados intermedios que puedan estar en el paquete ...

Recomiendo encarecidamente tener cuidado con el archivo resultante; sería una buena idea configurar umask en 377 primero (no unix: esto significa que solo el propietario puede leer el archivo que se creó). Supongo que son 2 pasos, si su umask predeterminado es permisivo ...

tlhackque
fuente
2

Ahora, la clave privada:

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

Elimine ahora la frase de contraseña:

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

Los 2 pasos pueden ser reemplazados por

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

Ninguno de estos funcionó para mí. Al final volví al código dotNet que funcionó por primera vez.

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
fuente