Como remover a senha de chave privada do contêiner pkcs12?


40
  1. Eu extraí o certificado usando o comando SSL / export do Chrome.
  2. Em seguida, forneceu como entrada para o openvpn - na configuração do openvpn:
    pkcs12 "path/to/pkcs12_container"
  3. Ao ligar openvpn ~/openvp_config, solicita uma senha para chave privada (que eu inseri ao exportar usando o Chrome):
    Enter Private Key Password:...
  4. Quero remover esta solicitação de senha.

A pergunta: como remover a senha da chave privada do pkcs12?

Ou seja, crie um arquivo pkcs12 que não exija uma senha.

(parece que de alguma forma eu já fiz isso há um ano e agora esqueci.damn.)


o script a seguir faz isso (essencialmente é resposta a zero): gist.github.com/5nizza/7ae9cff0d43f33818a33 use :./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat

Respostas:


48

Isso pode ser alcançado por várias opensslchamadas.

  • SENHA é sua senha atual
  • YourPKCSFile é o arquivo que você deseja converter
  • NewPKCSWithoutPassphraseFile é o arquivo de destino para o PKCS12 sem senha

Primeiro, extraia o certificado:

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

Segundo, a chave CA:

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

Agora, a chave privada:

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

Agora remova a senha:

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

Junte as coisas para o novo arquivo PKCS:

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

E crie o novo arquivo:

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

Agora você tem um novo arquivo de chave PKCS12 sem senha na parte da chave privada.


resposta incrível! ..o que é ca-cert.ca?
Ayrat

@Ayrat: Esta é a parte do certificado da CA da sua chave. - Eu tenho um erro de digitação na resposta, corrigindo ... - sinta-se livre para upvote e aceitar a resposta depois que você tentou fazê-lo :-)
zero0

2
-nodesé ignorado quando -exportusado, não está documentado para este caso (consulte a página de manual openssl, -nodesé listado apenas ao exportar do PKCS # 12 para o PEM). Sua última ligação ainda solicita uma senha de exportação. E se eu clicar em retornar, recebo um arquivo PKCS # 12 cuja senha é uma sequência vazia e não uma sem senha. Quando o faço openssl pkcs12 -in "NewPKCSWithoutPassphraseFile", ainda solicita uma senha de importação. Eu posso apenas pressionar return e isso funciona, mas se não houvesse senha, ela nem sequer solicitaria.
Mecki #

35

A solução mais simples que encontrei é

Exportar para arquivo pem temporário

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

Converter pem novamente em p12

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

Remover certificado temporário

rm temp.pem

Não vejo uma desvantagem nessa abordagem.
Matt Beckman

Algumas ferramentas requerem uma senha. Por exemplo keytool -v -list -storetype pkcs12 -keystore unprotected.p12, emitirá um aviso e NÃO listará o certificado. Portanto, pode funcionar para o OpenVPN, mas não para outra coisa.
mivk

@mivk o que você quer dizer? Que algumas ferramentas exigem uma chave protegida por senha?
Koen.

11
Claro, mas a pergunta é sobre remover a senha, não sobre aplicativos que exigem que uma senha seja definida.
Koen.

2
Sua solução não cria um PKCS # 12 sem senha, mas com uma senha "" (sequência vazia), que não é a mesma.
Mecki #

5

Isso pode ser feito facilmente em uma etapa, sem arquivo temporário:

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

Responda ao prompt Import Password com a senha. Responda aos prompts Export Passowrd com <CR>

Feito.

Observe que isso lida com qualquer número de certificados intermediários que possam estar no pacote ...

Eu recomendo fortemente tomar cuidado com o arquivo resultante; seria uma boa ideia definir umask para 377 primeiro (não unix: isso significa que apenas o proprietário pode ler o arquivo criado.) Suponho que sejam 2 etapas, se o umask padrão for permissivo ...


2

Agora, a chave privada:

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

Remova agora a senha:

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

Os 2 passos podem ser substituídos por

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

0

Nada disso funcionou para mim. No final, voltei ao código dotNet, que funcionou pela primeira 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;
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.