Convertendo um Java Keystore no Formato PEM

132

Estou tentando converter de um arquivo keystore Java em um arquivo PEM usando keytool e openssl applicactions. Mas não consegui encontrar uma boa maneira de fazer a conversão. Alguma ideia?

Em vez de converter o keystore diretamente no PEM, tentei primeiro criar um arquivo PKCS12 e depois converter o arquivo PEM e o Keystore relevantes. Mas não consegui estabelecer uma conexão usando-os. (Observe que eu só preciso de um arquivo PEM e um arquivo Keystore para implementar uma conexão segura. Não há restrições como "Iniciar a partir de um arquivo keystore java". :) :) Portanto, a partir de outros formatos é aceitável no meu caso)

Mas é preferível um método de conversão direta de jks para pem.

Chathuranga Chandrasekara
fonte

Respostas:

214

É bem simples, usando jdk6 pelo menos ...

bash $ keytool - keystore foo.jks - genkeypair - alias foo \
        -dname 'CN = foo.example.com, L = Melbourne, ST = Victoria, C = AU'
Digite a senha do keystore:  
Re-introduza a nova palavra-passe: 
Digite a senha da chave para 
        (RETURN se for igual à senha do keystore):  
bash $ keytool - keystore foo.jks - exportcert - alias foo | \
       openssl x509 -informa der -text
Digite a senha do keystore: asdasd
Certificado:
    Dados:
        Versão: 3 (0x2)
        Número de série: 1237334757 (0x49c03ae5)
        Algoritmo de assinatura: dsaWithSHA1
        Emissor: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Validade
            Antes: 18 de março 00:05:57 2009 GMT
            Não Depois: 16 de junho 00:05:57 2009 GMT
        Assunto: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Informações da chave pública do assunto:
            Algoritmo de chave pública: dsaEncryption
            Chave pública do DSA:
                bar: 
                    00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14:
                    7e: a6: 2e: 5a: 45: f9: 2f: b5: 2d: f4: 34: 27: e6: 53: c7:
 

bash $ keytool -importkeystore -srckeystore foo.jks \
       -destkeystore foo.p12 \
       -srcstoretype jks \
       -deststoretype pkcs12
Digite a senha do keystore de destino:  
Re-introduza a nova palavra-passe: 
Digite a senha do keystore de origem:  
Entrada para o alias foo importada com sucesso.
Comando de importação concluído: 1 entradas importadas com sucesso, 0 entradas falharam ou foram canceladas

bash $ openssl pkcs12 -in foo.p12 -out foo.pem
Digite a Senha de importação:
Verificado por MAC OK
Digite a senha do PEM:
Verificando - digite a frase secreta do PEM:

bash $ openssl x509 -text -in foo.pem
Certificado:
    Dados:
        Versão: 3 (0x2)
        Número de série: 1237334757 (0x49c03ae5)
        Algoritmo de assinatura: dsaWithSHA1
        Emissor: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Validade
            Antes: 18 de março 00:05:57 2009 GMT
            Não Depois: 16 de junho 00:05:57 2009 GMT
        Assunto: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Informações da chave pública do assunto:
            Algoritmo de chave pública: dsaEncryption
            Chave pública do DSA:
                bar: 
                    00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14:
                    7e: a6: 2e: 5a: 45: f9: 2f: b5: 2d: f4: 34: 27: e6: 53: c7:
 

bash $ openssl dsa -text -in foo.pem
leia chave DSA
Digite a senha do PEM:
Chave privada: (1024 bits)
priv:
    00: 8f: b1: af: 55: 63: 92: 7c: d2: 0f: e6: f3: a2: f5: ff:
    1a: 7a: fe: 8c: 39: dd
bar: 
    00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14:
    7e: a6: 2e: 5a: 45: f9: 2f: b5: 2d: f4: 34: 27: e6: 53: c7:



Você acaba com:

  • foo.jks - keystore no formato java.
  • foo.p12 - keystore no formato PKCS # 12.
  • foo.pem - todas as chaves e certificados do keystore, no formato PEM.

(Este último arquivo pode ser dividido em chaves e certificados, se você quiser.)


Resumo do comando - para criar o keystore JKS:

keytool -keystore foo.jks -genkeypair -alias foo \
    -dname 'CN=foo.example.com,L=Melbourne,ST=Victoria,C=AU'

Resumo do comando - para converter o keystore JKS no keystore PKCS # 12 e, em seguida, no arquivo PEM:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

se você tiver mais de um certificado em seu keystore JKS e desejar exportar apenas o certificado e a chave associados a um dos aliases, poderá usar a seguinte variação:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcalias foo \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

Resumo do comando - para comparar o keystore JKS ao arquivo PEM:

keytool -keystore foo.jks -exportcert -alias foo | \
   openssl x509 -inform der -text

openssl x509 -text -in foo.pem

openssl dsa -text -in foo.pem
Stobor
fonte
12
Certificados confiáveis ​​não são suportados neste método: esta é uma restrição do formato PKS12, acredito que consulte: java.sun.com/javase/6/docs/technotes/guides/security/jsse/… (seção em java.security.KeyStoreException : TrustedCertEntry não suportado)
andygavin 11/11/09
2
Eu tenho um arquivo JKS mais antigo. Não foi possível exportar usando o método acima. Eu finalmente consegui fazer isso definindo keytool arg '-destkeypass' para um valor fictício. 'keytool' até solicita um aviso dizendo que está ignorando o valor de destkeypass? Nenhuma outra técnica funcionaria. O uso dos prompts não funcionou, apenas funciona a partir do argumento da linha de comando. Deve haver um erro na exportação do PKCS12, alguém pode comentar?
amigos estão dizendo sobre cmcginty
4
"openssl pkcs12 -in foo.p12 -out foo.pem" lança o seguinte erro Inserir senha de importação: MAC verificado OK Erro ao emitir chaves e certificados 139848775526048: erro: 06065064: rotinas de envelope digital: EVP_DecryptFinal_ex: descriptografia incorreta: evp_enc.c: 539 : 139848775526048: erro: 23077074: rotinas PKCS12: PKCS12_pbe_crypt: pkcs12 erro cipherfinal: p12_decr.c: 104: 139848775526048: erro: 2306A075: rotinas PKCS12: PKCS12_item_decry: pkcs12: Qual é a solução para isso?
Udara SS Liyanage 18/03/2013
1
um aviso para as outras pessoas, o comando keytool leva um tempo para ser concluído, por algum motivo, eu tive que esperar 30 segundos até que a exportação foi feito
Nicolas Mommaerts
1
@ UdaraS.SLiyanage: veja a resposta de Casey para a solução #
Nicolas Mommaerts
29

Eu continuava recebendo erros opensslao usar o comando do StoBor:

MAC verified OK
Error outputting keys and certificates
139940235364168:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:535:
139940235364168:error:23077074:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 cipherfinal error:p12_decr.c:97:
139940235364168:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt error:p12_decr.c:123:

Por alguma razão, apenas esse estilo de comando funcionaria para o meu arquivo JKS

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -srcalias mykey \
   -deststoretype pkcs12 \
   -destkeypass DUMMY123

A chave foi definir destkeypass, o valor do argumento não importava.

cmcginty
fonte
6
O raciocínio pode ser encontrada aqui: herongyang.com/PKI/... O destkeypass IMPORTA btw
Nicolas Mommaerts
Votei positivamente neste comentário, mas ele merece seu próprio post. Foi difícil de encontrar aqui.
Richie Rich
15

O keytoolcomando não permitirá que você exporte a chave privada de um armazenamento de chaves. Você precisa escrever algum código Java para fazer isso. Abra o armazenamento de chaves, obtenha a chave necessária e salve-a em um arquivo no formato PKCS # 8. Salve o certificado associado também.

KeyStore ks = KeyStore.getInstance("jks");
/* Load the key store. */
...
char[] password = ...;
/* Save the private key. */
FileOutputStream kos = new FileOutputStream("tmpkey.der");
Key pvt = ks.getKey("your_alias", password);
kos.write(pvt.getEncoded());
kos.flush();
kos.close();
/* Save the certificate. */
FileOutputStream cos = new FileOutputStream("tmpcert.der");
Certificate pub = ks.getCertificate("your_alias");
cos.write(pub.getEncoded());
cos.flush();
cos.close();

Use os utilitários OpenSSL para converter esses arquivos (que estão no formato binário) para o formato PEM.

openssl pkcs8 -inform der -nocrypt < tmpkey.der > tmpkey.pem
openssl x509 -inform der < tmpcert.der > tmpcert.pem
erickson
fonte
Obrigado erickson. A conclusão é "Não podemos realizar uma conversão direta de JKS para PEM usando apenas os utilitários keytool e openssl". Estou correcto?
Chathuranga Chandrasekara 17/03/09
4
Você só precisa escrever código até o Java 1.4 - a partir do Java 5, keytool e openssl podem ser combinados para executar uma conversão em dois estágios do JKS -> PKCS # 12 -> PEM. No entanto, escrever sua própria ferramenta-chave é a única maneira de executar a CONVERSÃO DIRETA a partir do JKS -> PEM.
Stobor 04/10/10
Eu acho que é do JDK 6 em diante. Mas sim, uma importação PKCS # 12 agora é suportada.
Erickson
13

Conversão direta de arquivo jks para pem usando o keytool

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
sanghaviss
fonte
10
Sim, isso exporta o certificado. No entanto, ele não exporta as informações da chave ...
Stobor
Esta é a resposta simples e exata para o que eu estava pesquisando em dezenas keytoole jbosspáginas de documentos sem sucesso. Obrigado!
precisa saber é
15
ISTO NÃO EXPORTA INFORMAÇÕES-CHAVE PRIVADAS
James
1
Exporta certificado de chave pública
asami 27/01
Eu tentei executar este comando. Requer senha, Digite a senha do keystore: erro da ferramenta key: java.io.IOException: o keystore foi violado ou a senha estava incorreta. Eu tenho usado senha como (senha), mas ele estava jogando mesmo erro
Mohit Singh
9

Instruções simplificadas para converter um arquivo JKS para os formatos PEM e KEY (.crt e .key):

keytool -importkeystore -srckeystore <Source-Java-Key-Store-File> -destkeystore <Destination-Pkcs12-File> -srcstoretype jks -deststoretype pkcs12 -destkeypass <Destination-Key-Password>

openssl pkcs12 -in <Destination-Pkcs12-File> -out <Destination-Pem-File>

openssl x509 -outform der -in <Destination-Pem-File> -out <Destination-Crt-File>

openssl rsa -in <Destination-Pem-File> -out <Destination-Key-File>
asami
fonte
2

Encontrei uma solução muito interessante:

http://www.swview.org/node/191

Em seguida, dividi o par de chave pública / privada em dois arquivos private.key publi.pem e funciona!

Marco Luly
fonte
2

A conversão de um JKS KeyStore em um único arquivo PEM pode ser facilmente realizada usando o seguinte comando:

keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" >> "myKeystore.pem"

Explicação:

  1. keytool -list -rfc -keystore "myKeystore.jks"lista tudo no KeyStore 'myKeyStore.jks' no formato PEM. No entanto, também imprime informações extras.
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d"filtra tudo o que não precisamos. Ficamos com apenas os PEMs de tudo no KeyStore.
  3. >> "myKeystore.pem" escreva os PEMs no arquivo 'myKeyStore.pem'.
Mark Lagendijk
fonte
3
bash
:!
1
@ user3217883 Você poderia tentar algo como sed "s/^\-*BEGIN [A-Z]*\-*$//g;s/^\-*END [A-Z]*\-*$//g"vez (com o GNU sed), mas eu não tenho certeza se isso é o suficiente se houver mais do que uma cert no seu porta-chaves
Idriss Neumann
se você estiver recebendo bash: !d": event not found: para o bash, um ponto de exclamação é uma tecla curta para usar um comando. Para usar esta resposta você precisa usar apóstrofos no lugar das citações para a opção utilizados como -e para sedkeytool -list -rfc -keystore "myKeystore.jks" | sed -e '/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d' >> "myKeystore.pem"
B.Adler
Infelizmente, isso só exporta o certificado, não a chave privada
Maddin
2

Primeiro faça o dump do keystore de JKS para PKCS12

1. keytool -importkeystore -srckeystore ~ ​​/ .android / debug.keystore -destkeystore intermediário.p12 -srcstoretype JKS -deststoretype PKCS12

Despejar o novo arquivo pkcs12 no pem

  1. openssl pkcs12 -em intermediário.p12 -nós -out intermediário.rsa.pem

Você deve ter o certificado e a chave privada no formato pem. Divida-os. Coloque a parte entre “BEGIN CERTIFICATE” e “END CERTIFICATE” em cert.x509.pem Coloque a parte entre “BEGIN RSA PRIVATE KEY” e “END RSA PRIVATE KEY” em private.rsa.pem Converta a chave privada no formato pk8 como esperado por signapk

3. openssl pkcs8 -topk8 -outform DER - em private.rsa.pem -inform PEM -out private.pk8 -nocrypt

nkalra0123
fonte
1

Bem, o OpenSSL deve fazê-lo facilmente a partir de um arquivo # 12:

openssl pkcs12 -in pkcs-12-certificate-file -out pem-certificate-file
openssl pkcs12 -in pkcs-12-certificate-and-key-file -out pem-certificate-and-key-file

Talvez mais detalhes sobre o que é o erro / falha?

Charlie Martin
fonte
1

Caso você não tenha o openssl instalado e esteja procurando uma solução rápida, existe um software chamado portcle que é muito útil e pequeno para fazer o download.

A desvantagem é que não há linha de comando, até onde eu saiba. Mas a partir da GUI, é bastante simples exportar uma chave privada PEM:

  1. Abra seu keystore JKS
  2. Clique com o botão direito do mouse na entrada da chave privada e selecione Exportar
  3. Selecione Chave privada e certificados e formato PEM

    Exportar chave privada PEM do JKS com Portcle

Marcio Jasinski
fonte
0

Experimente o Keystore Explorer http://keystore-explorer.org/

O KeyStore Explorer é uma substituição da GUI de código aberto para o keytool e jarsigner dos utilitários de linha de comando Java. Ele também abre o openssl / pkcs12.

Johnny Boy
fonte
0

primeiro crie o arquivo keystore como

C: \ Arquivos de programas \ Android \ Android Studio \ jre \ bin> keytool -keystore androidkey.jks -genkeypair -alias androidkey

Digite a senha do keystore: Digite
novamente a nova senha:
Qual é o seu nome e sobrenome? Desconhecido: Nome Sobrenome
Qual é o nome da sua unidade organizacional? Desconhecido: desenvolvimento móvel
Qual é o nome da sua organização? Desconhecido: nome da sua empresa
Qual é o nome da sua cidade ou localidade? Qual é o nome do seu estado ou província?
Qual é o código do país com duas letras para esta unidade? Desconhecido: IN // pressione enter

Agora ele pedirá para confirmar

CN = Nome Sobrenome, OU = Desenvolvimento móvel, O = O nome da sua empresa, L = Nome da cidade, ST = Nome do estado, C = IN correto? [não]: sim

Digite a senha da chave para (RETURN se a mesma senha do keystore): pressione enter se desejar a mesma senha

chave foi gerada, agora você pode simplesmente obter o arquivo pem usando o seguinte comando

C: \ Arquivos de programas \ Android \ Android Studio \ jre \ bin> keytool -export -rfc -alias androidkey -arquivo android_certificate.pem -keystore androidkey.jks
Digite a senha do keystore:
certificado armazenado no arquivo

Ankit Dubey
fonte
0

Convertendo um Java Keystore no Formato PEM

A resposta mais precisa de todas deve ser que isso NÃO é possível.

Um keystore Java é apenas um recurso de armazenamento para chaves e certificados criptográficos , enquanto o PEM é um formato de arquivo apenas para certificados X.509.

whaefelinger
fonte