Como importar um certificado .cer para um keystore java?

226

Durante o desenvolvimento de um cliente de serviço web Java, encontrei um problema. A autenticação para o serviço da web está usando um certificado de cliente, um nome de usuário e uma senha. O certificado de cliente que recebi da empresa por trás do serviço da web está em .cerformato. Quando inspeciono o arquivo usando um editor de texto, ele possui o seguinte conteúdo:

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----

Posso importar esse arquivo como um certificado no Internet Explorer (sem precisar digitar uma senha!) E usá-lo para autenticar no serviço da web.

Consegui importar esse certificado para um keystore, eliminando primeiro a primeira e a última linha, convertendo em novas linhas unix e executando uma decodificação base64. O arquivo resultante pode ser importado para um keystore (usando o keytoolcomando). Quando eu listar as entradas no armazenamento de chaves, essa entrada é do tipo trustedCertEntry. Devido a esse tipo de entrada (?), Não posso usar este certificado para autenticar com o serviço da web. Estou começando a pensar que o certificado fornecido é um certificado público que está sendo usado para autenticação ...

Uma solução alternativa que encontrei é importar o certificado no IE e exportá-lo como um .pfxarquivo. Este arquivo pode ser carregado como um keystore e pode ser usado para autenticar com o serviço da web. No entanto, não posso esperar que meus clientes executem essas etapas sempre que receberem um novo certificado. Então, eu gostaria de carregar o .cerarquivo diretamente no Java. Alguma ideia?

Informações adicionais: a empresa responsável pelo serviço da web me disse que o certificado deveria ser solicitado (usando o IE e o site) do PC e do usuário que importaria o certificado posteriormente.

Jan-Pieter
fonte

Respostas:

317
  • Se você deseja se autenticar, precisa da chave privada - não há outra opção.
  • Um certificado é uma chave pública com propriedades extras (como nome da empresa, país, ...) assinada por alguma autoridade de Certificação que garante que as propriedades anexadas sejam verdadeiras.
  • .CERarquivos são certificados e não têm a chave privada. A chave privada é fornecida com um .PFX keystorearquivo normalmente. Se você realmente se autentica é porque já havia importado a chave privada.
  • Você normalmente pode importar .CERcertificados sem problemas com

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 
lujop
fonte
3
Acontece que a chave privada está sendo gerada por um plugin para o IE. A única solução por enquanto é importar o certificado no IE e exportar um arquivo .pfx.
Jan-Pieter
5
Os arquivos .CER possuem a chave pública. Eles não têm a chave privada. Sugerir edição ..
KyleM 20/05
6
O que -alias faz aqui?
hop
5
:( -> keytool error: java.lang.Exception: Input not a X.509 certificate
necromancer
1
@hop Um keystore java pode ter vários certificados, cada um com um alias diferente para identificá-lo. Você pode usá-lo como referência para identificá-lo e / ou recuperá-lo programaticamente pelo nome alternativo.
Lujop
85

A importação do .cerarquivo de certificado baixado do navegador (abra o URL e procure por detalhes) no keystore do cacertsjava_home\jre\lib\security funcionou para mim, em oposição às tentativas de gerar e usar meu próprio keystore.

  1. Vá para sua java_home\jre\lib\security
  2. ( Windows ) Abra a linha de comando do administrador usando cmde CTRL+ SHIFT+ENTER
  3. Execute o keytool para importar o certificado:
    • (Substitua yourAliasNamee path\to\certificate.cerrespectivamente)

 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

Dessa forma, você não precisa especificar nenhuma opção adicional da JVM e o certificado deve ser reconhecido pelo JRE.

jediz
fonte
caminho \ para \ cert. Se meu arquivo estiver na área de trabalho, como localizá-lo? C: / user / desktop / ou ../../../../desktop/filename
Jesse
no MacOS / Linux, este comando funciona com o sudo. Obrigado. mas o que é param noprompt? Eu não o usei e ainda consegui.
Evgeniy Mishustin
Observe que, ao usar o JDK para desenvolvimento, o caminho correto é java_home\jdk_x.xx\jre\lib\security Para um caminho absoluto, use barra invertida, por exemplo, "C:\myCert.crt"aspas são opcionais se o caminho não contiver espaços em branco.
Jp-jee
Graças um milhão de vezes.
vikingsteve
Pergunta: E a chave privada? A discussão é sobre certificados de cliente. Meu entendimento é que é necessário criar um CSR com uma chave privada, depois receber um certificado de cliente da empresa remota do site e depois associá-lo à chave privada. Sua resposta parece não mencionar nada sobre a chave privada. Só perguntando.
user2367418
51

Aqui está o código que eu tenho usado para importar programaticamente arquivos .cer para um novo KeyStore.

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//VERY IMPORTANT.  SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

//Put everything after here in your function.
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}
Patrick M
fonte
20

Você não precisa fazer alterações no certificado. Tem certeza de que está executando o comando de importação correto?

O seguinte funciona para mim:

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

onde mycert.cer contém:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----
dogbane
fonte
2
Quando tento importar o certificado não modificado para o keystore, recebo o erro "keytool error: java.lang.Exception: não é um certificado X.509". Após modificar o certificado da maneira descrita em minha postagem, sou capaz de importar o certificado sem erros com um comando semelhante ao seu. No entanto, ele é importado como um confiávelCertEntry e não é usado ao acessar o serviço da web.
Jan-Pieter
Você pode adicionar o comando a exceção à pergunta? Tem certeza de que está especificando um alias no seu comando de importação?
dogbane
Não se esqueça de executar cmd como administrador se você estiver usando o Windows
SilentBob470
9

Uma ferramenta GUI de código aberto está disponível em keystore-explorer.org

KeyStore Explorer

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. O KeyStore Explorer apresenta suas funcionalidades e muito mais através de uma interface gráfica intuitiva do usuário.

As telas a seguir ajudarão (são do site oficial)

Tela padrão que você obtém executando o comando:

shantha@shantha:~$./Downloads/kse-521/kse.sh

insira a descrição da imagem aqui

E vá para Examinee Examine a URLopção e, em seguida, dar o URL da web que você deseja importar.

A janela de resultados será como abaixo se você der o link do site do google. insira a descrição da imagem aqui

Esse é um dos casos de uso e o restante depende do usuário (todos os créditos estão no keystore-explorer.org )

Shantha Kumara
fonte
7

O certificado que você já possui provavelmente é o certificado do servidor ou o certificado usado para assinar o certificado do servidor. Você precisará dele para que seu cliente de serviço da web possa autenticar o servidor.

Mas se, além disso, você precisar executar autenticação de cliente com SSL, precisará obter seu próprio certificado para autenticar seu cliente de serviço da web. Para isso, você precisa criar uma solicitação de certificado; o processo envolve a criação de sua própria chave privada e a chave pública correspondente e a anexação dessa chave pública juntamente com algumas informações (email, nome, nome de domínio etc.) a um arquivo chamado solicitação de certificado. Em seguida, você envia a solicitação de certificado para a empresa que já solicitou, e eles criarão seu certificado assinando sua chave pública com sua chave privada e enviarão de volta um arquivo X509 com seu certificado, que você pode agora adicione ao seu keystore e você estará pronto para se conectar a um serviço da Web usando SSL, exigindo autenticação do cliente.

Para gerar sua solicitação de certificado, use "keytool -certreq -alias -file -keypass -keystore". Envie o arquivo resultante para a empresa que o assinará.

Quando você receber seu certificado de volta, execute "keytool -importcert -alias -keypass -keystore".

Pode ser necessário usar -storepass nos dois casos, se o keystore estiver protegido (o que é uma boa ideia).

Chochos
fonte
5

Aqui está um script que eu usei para importar em lote um monte de arquivos crt no diretório atual para o keystore java. Salve isso na mesma pasta que o seu certificado e execute-o da seguinte maneira:

./import_all_certs.sh

import_all_certs.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_java_keystore
else
  echo "This script needs to be run as root!"
fi
Brad Parks
fonte
1

Veja como isso funcionou para mim:

  1. Salve como .txt os dados do certificado no seguinte formato em um editor de texto

    ----- COMEÇAR CERTIFICADO ----- [dados serializados pela microsoft] ----- TERMINAR CERTIFICADO -----

  2. Abra o navegador chrome (esta etapa também pode funcionar com outros navegadores) configurações> mostrar configurações avançadas> HTTPS / SSL> gerenciar certificados Importar o .txt na etapa 1
  3. Selecione e exporte esse certificado no formato codificado em Base-64. Salve-o como .cer
  4. Agora você pode usar o keytool ou o Portecle para importá-lo para o seu keystore java
code4kix
fonte