Importar Certificado Digital

Pessoal,
estou precisando usar um certificado digital em minha aplicação. O meu cliente comprou o certificado(e-cpf) e recebou o um arquivo .pfx. Como nunca tinha trabalhado com certificados antes, to apanhando muito. Pesquisando descobrir que tenho que gerar um arquivo jks, usando o keytool, e depois importar para esse arquivo o certificado do meu cliente.
Consegui fazer a primeira parte, gerar o jks, porém não consigo importar o certificado. Estou usando novamente o keytool o comando que estou utilizando é esse:

keytool -importcert -keystore cliente.jks -alias {alias do cliente} -storetype pkcs12 -file certificado.pfx -storepass {senha de acesso do certificado}

para gerar o jks usei este comando:
keytool -genkeypair -alias {alias do cliente} -keyalg RSA -dname {dados do cliente} -keypass ${senha do certificado} -storepass ${senha do certificado} -keystore cliente.jks -validity 2000

Alguém pode me ajudar?

grato,
Thiago Melo.

sim pessoal, tava esquecendo… qdo eu tento importar ele da uma mensagem de erro que traduzindo, significa que o arquivo é grande d+… =/

alguém pode ajudar?

Perguntas bobas.

  1. O arquivo é válido mesmo (ou seja, se você der um duplo clique sobre ele no Windows Explorer, ele é importado para a base de certificados do Windows com sucesso?)
  2. Que versão do Java você está usando? Eu sei que o Java 1.4.2 tem alguns problemas com PFX e você precisa atualizá-lo para 1.4.2_08 ou posterior. Versões mais antigas do Java podem nem ter suporte a PFX (PKCS#12).

Interface gráfica que pode te ajudar a importar o certificado:
http://yellowcat1.free.fr/index_ktl.html

thingol, o arquivo é válido sim, inclusive para poder gerar as chaves através do keytool eu primeiro listei as propriedades do arquivo .pfx através do keytool -list.

Gostaria de saber de vc ou de outra pessoa que pode ajudar, se esse procedimento que adotei de: gerar um arquivo jks, e depois importar o pfx, está correto? pq to meio perdido nesse assunto… =/

Grato pela ajuda,
Thiago Melo.

Achei que a sua dúvida fosse somente com relação aos comandos…

O procedimento padrão para se obter um certificado digital é:

  • Gerar as chaves
  • Gerar o CSR
  • Enviar o CSR para a CA
  • Receber o arquivo de certificado e importar para keystore

Pelo o que você descreveu você só tem um arquivo .pfx (Personal Information Exchange). Este tipo de arquivo pode tanto conter apenas o certificado como a chave privada. Até o JDK 1.5, o comando keytool não permitia importar chaves privadas, somente certificados. Se o seu objetivo for somente gerar um arquivo JKS contendo o certificado, export o certificado do arquivo PFX (de um double-click no Windows e escolha a opção de “copy to file” e escolha o format DER base64) e import através do comando (keytool -importcert). Se for importar a chave também, use o comando “keytool -importkeystore”. Lembrando que isto só funciona no JDK 6. Aquela interface gráfica pode te ajudar.

oyama,
realmente eu só tenho o arquivo .pfx. Eu não participei na fase de aquisição desse certificado digital. Então o que eu tenho é só isso.
já baixei a interface gráfica e vou tentar exportar o certificado para DER e depois importar, assim como vc falou.

Grato,
Thiago Melo.

oyama,
estava tentando exportar o certificado para DER, mas quando vou no browser e tento exportar, essa opção esta desabilitada só restando exportar em .pfx =( Alguma dica?

Grato,
Thiago Melo.

Nunca trabalhei com PFX, mas pelo o que eu pesquisei o formato segue a especificação PKCS#12. Se for verdade, pode-se tentar usar a função “keytool -importkeystore” e usar como “-srcstoretype PKCS12”.

PFX é o nome Microsoft para o arquivo PKCS#12.

O que pode dar problemas é que, em algumas versões do JDK mais antigas, alguns certificados gerados pelo Certificate Services do Windows 2000/2003/2008 Enterprise Server contém alguns campos (AIA etc.) que contém URLs que essas versões não gostam (como “file:///servidor/certsrv/” ou coisa parecida.)

Outras coisas que talvez possam dar problemas são: você usar um certificado com chave muito grande (2048/4096 bits) e você não puser as “unrestricted policy files” no diretório jre/lib/security (acho que são us_policy.jar e local_security.jar, não sei os nomes certos de cor).

Além disso, o e-cpf e o e-cnpj são emitidos por autoridades certificadoras cuja raiz é o ICP-Brasil, que não está definido no CACERTS da JRE e que normalmente deve ser inserido nesse arquivo manualmente. (Acho que o password desse arquivo é “changeit”).

oyama,
consegui importar o certificado, usei aquela ide que vc indicou. Criei um jks vazio e fui em importar --> keystore’s entry --> Trusted certificate --> Regular certificate. Não sei se é isso mesmo, vou fazer uns testes e depois posto aqui o resultado.

Grato,
Thiago Melo.

thingol,
como informei antes eu consegui importar o certificado(exportei no IE como DER). Mesmo assim eu ainda tenho que fazer essa configuração no JRE?? se tiver pode me dizer como faço?

Grato,
Thiago Melo.

O arquivo cacerts é um keystore, com a senha changeit e o tipo JKS, que fica em um diretório jre/lib/security na sua instalação do Java.

O arquivo de certificado do ICP-Brasil deve ser baixado de https://www.icpbrasil.gov.br/CertificadoACRaiz.crt

Você pode incluir esse certificado em cacerts como se fosse um “trusted certificate”.

Talvez você precise incluir em cacerts os arquivos das autoridades certificadoras intermediárias (no caso, o da Receita Federal, e da autoridade certificadora que emitiu o e-cpf ou e-cnpj, como o certificado da Certisign ou do Serpro ou Serasa.

pessoal, como falei anteriormente eu consegui importar o certificado que está em formato .pfx. Porém para exportar para DER tive que desmarcar a opção “Exportar chave privada” no I.E senão ele só deixava eu exportar para outro .pfx. O problema é que no meu código de assinatura do arquivo xml, eu preciso da chave privada para poder a assinatura. Vcs sabem como eu posso extrair essa chave desse bendito arquivo .pfx?

pedaço do meu código:

   KeyStore ks = KeyStore.getInstance("JKS");
   FileInputStream fis = new FileInputStream(keystoreFile);
   
   //load the keystore
   ks.load(fis, "senha do arquivo".toCharArray());
   
   //get the private key for signing.
   PrivateKey privateKey = (PrivateKey) ks.getKey(privateKeyAlias,  privateKeyPass.toCharArray());

Grato,
Thiago Melo.

Amigo, o correto é pegar o próprio arquivo PKCS#12 (também conhecido como PFX) e usar como keystore.

Vou dar um exemplo de como usar um arquivo PKCS#12 como keystore. Antes disso é necessário achar o alias correto (usando o comando keytool -list -storetype pkcs12 -keystore “arquivo.pfx” e vendo as entradas que contém “PrivateKeyEntry”.)

KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis = new FileInputStream(keystoreFile);

//load the keystore
ks.load(fis, "senha do arquivo".toCharArray());

//get the private key for signing.
PrivateKey privateKey = (PrivateKey) ks.getKey(privateKeyAlias, privateKeyPass.toCharArray());
1 curtida

thingol , vlw mesmo cara!!! uma solução mto simples. Testei aqui e funcionou blz cara, consegui assinar meu xml. vlw mesmo. O problema todo era que eu pensava que tinha que gerar um jks…

Agradeço também a colaboração do oyama, vlw tbm !!

Grato,
Thiago Melo.

Pois é, pq dizem q tem q gerar um JKS ou um CER se pode ser feito de maneira direta?

Eu to me batendo ainda, tô no início de tudo, mas essa foi a explicação mais simples q vi até agora, eu
baixei um certificado para teste, o Associacao.pfx, breve estarei testando isso.

Valeu as dicas aí.

Thingol,

Pode dar uma dica rapidex?

Opa… só para me entender melhor…

Estou com uma duvida sobre o arquivo .cer, ele é o mesmo que o pfx?

Pelo que entendi funciona assim…
Temos o arquivo pfx, o qual usamos para pegar a Chave Privada e assinar algum documento… e para isso devemos fazer o camando:

[code]FileInputStream fis = new FileInputStream(keystoreFile);

//load the keystore
ks.load(fis, “senha do arquivo”.toCharArray());[/code]
Sendo a varíavel “keystoreFile” o caminho do arquivo .pfx (correto?)

Bom… poderiamos exportar o arquivo .CER do certificado (arquivo pfx) e usar esse .CER apra assinar os documentos tb ?? Dentro desse .CER temos tanto a chave Privada quanto a Publica ?

Pergunto isso, porque o .CER que é usado para jogarmos dentro do keystore (“cacerts” por exemplo). E também, se usarmos o token, podemos exportar o .CER para usar…

Vlw