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
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?)
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).
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… =/
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.
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?
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”.
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.
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?
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());
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());
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 !!
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.
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…