Como converter arquivo .pfx para armazenamento de chaves com chave privada?

107

Preciso assinar o aplicativo Android ( .apk).
Eu tenho .pfxarquivo. Eu o converti em .cerarquivo através do Internet Explorer e depois converti .cerpara .keystoreusar o keytool. Então eu tentei assinar.apk com o jarsigner, mas ele diz que .keystore não contém uma chave privada.

O que estou fazendo de errado?

Ola
fonte
Isso pode ser útil: como posso encontrar e executar o keytool para Windows stackoverflow.com/questions/5488339/…
Peter Barbanyaga,

Respostas:

259

Usando JDK 1.6 ou posterior

Foi apontado por Justin nos comentários abaixo que o keytool sozinho é capaz de fazer isso usando o seguinte comando (embora apenas no JDK 1.6 e posterior):

keytool -importkeystore -srckeystore mypfxfile.pfx -srcstoretype pkcs12 
-destkeystore clientcert.jks -deststoretype JKS

Usando JDK 1.5 ou inferior

OpenSSL pode fazer tudo. Esta resposta no JGuru é o melhor método que encontrei até agora.

Em primeiro lugar, certifique-se de que você tem OpenSSL instalado. Muitos sistemas operacionais já o têm instalado, como descobri no Mac OS X.

Os dois comandos a seguir convertem o arquivo pfx em um formato que pode ser aberto como um armazenamento de chaves Java PKCS12:

openssl pkcs12 -in mypfxfile.pfx -out mypemfile.pem
openssl pkcs12 -export -in mypemfile.pem -out mykeystore.p12 -name "MyCert"

NOTE que o nome fornecido no segundo comando é o apelido da sua chave no novo armazenamento de chaves.

Você pode verificar o conteúdo do armazenamento de chaves usando o utilitário Java keytool com o seguinte comando:

keytool -v -list -keystore mykeystore.p12 -storetype pkcs12

Finalmente, se necessário, você pode convertê-lo em um armazenamento de chaves JKS, importando o armazenamento de chaves criado acima para um novo armazenamento de chaves:

keytool -importkeystore -srckeystore mykeystore.p12 -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS
MikeD
fonte
28
não há necessidade de todas as três etapas, apenas execute: keytool -importkeystore -srckeystore mykeystore.pxf -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS
JustinMorris
Acho que as versões mais antigas do keytool não permitiam isso. Eu me lembro que há 8 anos eu tinha que rodar o openssl, mas agora com o keytool no Oracle JDK 6 e 7 funciona muito bem, como o Justin falou.
David Brossard
2
Observe que dei essa resposta de uma forma mais simples com mais detalhes um ano antes de Justin.
gjpc de
@gjpc Noted. Sua resposta é muito completa e merece muitos votos
positivos
Esta é realmente uma ótima resposta e me salvou após dias de pesquisa. Esta resposta realmente merece muito mais votos positivos. Obrigado senhor.
Mythul
22

jarsigner pode usar seu arquivo pfx como o armazenamento de chaves para assinar seu jar. Certifique-se de que seu arquivo pfx tenha a chave privada e a cadeia de certificados ao exportá-lo. Não há necessidade de converter para outros formatos. O truque é obter o alias do seu arquivo pfx:

 keytool -list -storetype pkcs12 -keystore your_pfx_file -v | grep Alias

Depois de ter seu alias, é fácil assinar

jarsigner.exe -storetype pkcs12 -keystore pfx_file jar_file "your alias"

Os dois comandos acima solicitarão a senha que você especificou em pfx export. Se você quiser que sua senha seja exibida em texto não criptografado, use a opção -storepass antes da opção -keystore

Depois de assinado, admire seu trabalho:

jarsigner.exe -verify -verbose -certs  yourjarfile
gjpc
fonte
1
+1 por não ter que converter o arquivo de armazenamento de chaves (eu já tenho em formatos suficientes!)
Trejkaz
22

Encontrei esta página que ensina como importar um PFX para JKS (Java Key Store):

keytool -importkeystore -srckeystore PFX_P12_FILE_NAME -srcstoretype pkcs12 -srcstorepass PFX_P12_FILE -srcalias SOURCE_ALIAS -destkeystore KEYSTORE_FILE -deststoretype jks -deststorepass PASSWORD -destalias ALIAS_NAME
kaptan
fonte
3
Esta deve ser a resposta completa!
JustAGuy
Eu estava procurando uma resposta como esta - com nome alternativo
user3437460
2

Seu arquivo PFX deve conter a chave privada dentro dele. Exporte a chave privada e o certificado diretamente de seu arquivo PFX (por exemplo, usando OpenSSL) e importe-os para seu armazenamento de chaves Java.

Editar

Outras informações:

  • Baixe OpenSSL para Windows aqui .
  • Exportar chave privada: openssl pkcs12 -in filename.pfx -nocerts -out key.pem
  • Certificado de exportação: openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
  • Importe a chave privada e o certificado para o armazenamento de chaves Java usando keytool.
Bernard
fonte
você poderia me dizer como posso importar key.pem e cert.pem usando o keytool?
Sad Al Abdullah
Pequena adição: você deve adicionar -nodes no final ao exportar private ky
morgan_il
2

Justin (acima) está correto. No entanto, tenha em mente que dependendo de quem você obteve o certificado (CA intermediário, CA raiz envolvido ou não) ou como o pfx é criado / exportado, às vezes eles podem não ter a cadeia de certificados. Após a importação, você teria um certificado do tipo PrivateKeyEntry, mas com uma cadeia de comprimento 1.

Para corrigir isso, existem várias opções. A opção mais fácil em minha mente é importar e exportar o arquivo pfx no IE (escolhendo a opção de Incluir todos os certificados na cadeia). O processo de importação e exportação de certificados no IE deve ser muito fácil e bem documentado em outro lugar.

Uma vez exportado, importe o keystore como Justin apontou acima. Agora, você teria um armazenamento de chaves com certificado do tipo PrivateKeyEntry e com um comprimento de cadeia de certificado de mais de 1.

Certos clientes de serviços da Web baseados em .Net apresentam erro (não é possível estabelecer uma relação de confiança), se você não fizer o acima.

TechIsFun
fonte
Isso não parece funcionar no IE11. Ele não inclui a cadeia de certificados, embora eu esteja dizendo para isso. Eu sei que isso funcionou no passado.
Brian Knoblauch de
0

Se você trabalhar com o JDK 1.5 ou inferior, o utilitário keytool não terá a -importkeystoreopção (consulte a documentação do keytool do JDK 1.5 ) e a solução do MikeD estará disponível apenas transferindo o .pfxem uma máquina com um JDK mais recente (1.6 ou superior).

Outra opção no JDK 1.5 ou inferior (se você tiver o produto Oracle WebLogic) é seguir as instruções deste documento Oracle: Usando formatos de certificado PFX e PEM com keystores . Ele descreve a conversão para o .pemformato, como extrair informações de certificados desse formato textual e importá-las para o .jksformato com o java utils.ImportPrivateKeyutilitário (este é um utilitário incluído no produto WebLogic).

Mariano Paniga
fonte