Importação da cadeia e chave de certificado PEM para o Java Keystore

29

Existem muitos recursos disponíveis sobre esse tópico, mas não encontrei nenhum que cubra esse caso um pouco especial.

Eu tenho 4 arquivos;

  • privatekey.pem
  • certificate.pem
  • intermediário_rapidssl.pem
  • ca_geotrust_global.pem

E desejo importá-los para um keystore novo.

Alguns sites sugerem usar o formato DER e importá-los um por um, mas isso falhou porque a chave não é reconhecida.

Outro site sugeriu uma classe "ImportKey" especial para executar a importação, e isso funcionou até que vi que a cadeia estava quebrada. Ou seja, o comprimento da corrente no certificado é 1, ignorando o intermediário e ca.

Alguns sites sugerem o PKCS7, mas não consigo nem obter uma cadeia disso. Outros sugerem o formato PKCS12, mas, no que diz respeito aos meus testes, também falhou em obter toda a cadeia.

Qualquer conselho ou sugestão é muito bem-vindo.

Trollbane
fonte

Respostas:

26

Isso pode não ser perfeito, mas tive algumas anotações sobre o uso keytoolque modifiquei para o seu cenário.

  1. Importe um certificado CA raiz ou intermediário para um keystore Java existente:

    keytool -import -trustcacerts -alias root -file ca_geotrust_global.pem -keystore yourkeystore.jks
    keytool -import -trustcacerts -alias root -file intermediate_rapidssl.pem -keystore yourkeystore.jks 
    
  2. Combine o certificado e a chave privada em um arquivo antes de importar.

    cat certificate.pem privatekey.pem > combined.pem
    

    Isso deve resultar em um arquivo semelhante ao formato abaixo.

    COMEÇAR CERTIFICADO
    ...
    FINALIZAR CERTIFICADO
    INICIAR CHAVE PRIVADA RSA
    ...
    FINALIZAR CHAVE PRIVADA RSA

  3. Importe um certificado primário assinado e uma chave para um keystore Java existente:

    keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks
    
Aaron Copley
fonte
2
Que versão do keytool permite que você encadeie dessa maneira? Esta sintaxe dá "erro keytool: java.lang.Exception: O certificado não é importado, aliás <root> já existe" com ambos -import e -importcert
ctpenrose
Difícil de dizer, exatamente. Mas, dado o ano / mês, era provável que fosse o Java 6? (Não faço ideia do lançamento menor.) Qual versão você está usando? O erro parece que o problema pode estar no próprio keystore. ( alias <root> already exists) Você pode tentar com um novo armazenamento de chaves vazio?
Aaron Copley
11
O Keytool não permitirá que eu importe um certificado usando um alias 'root' já existente. Mas acho que foi um erro de digitação. Interessante notar que o keytool cria uma cadeia para o seu certificado quando encontra os certificados dos assinantes no keystore (sob qualquer alias). A ferramenta Java "Portecle" é útil para gerenciar o keystore java.
Houtman
O Keytool não funciona assim e não permite importar um alias mais de uma vez, conforme descrito. (E sim, eu tentei). Veja a resposta de senajqerib abaixo para algo que funciona corretamente.
Steve Sether
11
É uma resposta de três anos. É perfeitamente possível que as coisas tenham mudado, mas garanto que funcionou (ou estava quase funcionando, como eu indiquei que pode não ser perfeito) a partir de fevereiro de 2013. Fique à vontade para enviar uma edição ou sinalizá-la para atenção do moderador.
Aaron Copley
42

Concatene todos os arquivos * .pem em um arquivo pem, como all.pem Em seguida, crie o keystore no formato p12 com chave privada + all.pem

openssl pkcs12 -export -inkey private.key -in all.pem -name test -out test.p12

Em seguida, exporte p12 para jks

keytool -importkeystore -srckeystore test.p12 -srcstoretype pkcs12 -destkeystore test.jks
senanqerib
fonte
Obrigado. Esta é a única resposta completa e correta. Como você sugeriu, é muito mais fácil concatenar os certificados em um arquivo.
Steve Sether
Isso funcionou como um prazer para mim !! Eu usei essas instruções para converter uma cadeia de chaves usada no repositório nodejs-auto-assinado-certificado-exemplo para conversar com um servidor TLS baseado em Java. Graças um milhão!
Galder Zamarreño 11/11
Essa é a resposta correta.
sfThomas
8

O keytool não fornece uma maneira de importar certificado + chave privada de um único arquivo (combinado), conforme proposto acima. Ele funciona bem, mas apenas o certificado é importado, enquanto a chave privada é ignorada. Você pode verificá-lo keytool -list -v -keystore yourkeystore.jks- o tipo de entrada do seu domínio é TrustedCertEntry, não PrivateKeyEntry.

Portanto, para resolver o problema inicial, é necessário primeiro criar um keystore PKCS # 12 usando openssl (ou ferramenta similar) e depois importar o keystore keytool -importkeystore.

Ixmal
fonte