Ola,
Estou desenvolvendo uma aplicação para manipulação de certificados digitais, nesta etapa preciso de uma função que liste os certificados existentes, e com isso
seja possível o cliente selecionar o certificado desejado para transforma-lo nos formatos .cer e .jks. Ou seja, entrada = KeyStore capturado na lista do Windows, saida = chaveprivada.jks e chavepublica.cer.
Até o momento, estou conseguindo listar os certificados existentes no "Windows-MY" e joga-lo em um KeyStore, porém, não consigo gerar os arquivos .jks e .cer a partir desse KeyStore.
Abaixo o código utilizado:
Na classe principal faço a seguinte chamada da função loadCertificates, passando como parâmetro a senha, alias e o local onde será salvo o arquivo .cer.
Metodos exec = new Metodos();
try {
exec.loadCertificates(certi.getSenha(), certi.getAlias(), jtfSaidaCER.getText());
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Erro ao gerar arquivo CER!!" + e, "ERRO", JOptionPane.INFORMATION_MESSAGE);
System.out.println("Erro ao gerar arquivo CER!!! " + e);
}
A função loadCertificates tem o seguinte código, com os parâmetros passados anteriormente:
public void loadCertificates(String senha, String aliasIn, String out)
throws FileNotFoundException, KeyStoreException, IOException,
NoSuchAlgorithmException, CertificateException,
UnrecoverableEntryException, NoSuchProviderException {
//inicialização da variavel que recebera o certificado
X509Certificate cert = null;
//inicialização do KeyStore que lista os certificado existentes no "Windows-MY"
KeyStore kspkcs12 = null;
kspkcs12 = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
//Carregado o KeyStore com os valores nulos, pois não tenho o caminho físico do arquivo
kspkcs12.load(null, null);
//Verifica se dentro do KeyStore existe o alias passado como parâmetro (foi selecionado pelo cliente na tela anterior).
System.out.println("Contém Alias Desejado?: " + kspkcs12.containsAlias(aliasIn));
//Cria uma lista com todos os Alias contido dentro do KeyStore
final Enumeration<String> eAliases = kspkcs12.aliases();
//Contador
int cont = 0;
//Enquanto houverem registros irá executar o código a baixo
while (eAliases.hasMoreElements()) {
//Se contém o alias desejado então executa a operação a baixo
if (kspkcs12.containsAlias(aliasIn)) {
//Insere dentro de cert o certificado capturado do KeyStore
cert = (X509Certificate) kspkcs12.getCertificate(aliasIn);
}
//Contador =+ contador;
cont = cont + 1;
//Move para o próximo registro
eAliases.nextElement();
}
//Nessa parte do código tento escrever na saida 'out' passada por parâmetro a chave publica do 'cert'
try {
File file = new File(out);
ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(file));
output.writeObject(cert.getPublicKey().toString());
} catch (Exception e) {
System.out.println(e.toString());
}
}
Com esse código consigo gerar o arquivo, porém ele não tem o conteúdo desejado, acredito que esteja realizando a transformação de forma incorreta em algum ponto.
Tenho um arquivo correto, gerado na mão, referente a chavepublica.cer e comparei com este arquivo que esta sendo gerado, porém eles não são iguais, o que prova que esta sendo gerado
incorretamente pela função loadCertificates.
Obs.: [color=darkred]$$$$[/color][color=green] Ofereço remuneração a quem conseguir finalizar esta funcionalidade. [/color][color=darkred]$$$$ [/color]
