Gerar .jks e .cer a partir do Windows-MY

9 respostas
L

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]

9 Respostas

L

Dependendo do tipo do certificado, A3 em um token/card por exemplo, vc não consegue extrair a chave privada.

L

lsjunior,

esta aplicação utiliza somente os certificados do tipo A1.

Obrigado pela atenção

L

E os dados do certificado vc recupera usando o getEncoded(), que resultará no certificado no formato DER(binário), se quiser no formato abaixo:

----- BEGIN CERTIFICATE----- adasdadasd.... .... -----END CERTIFICATE-----

Deve codificar o getEncoded() em base64, que resultará em no formato PEM.

L

Já tenho muita coisa pronta de certificação, assinatura, timestamp, etc, nesse repositório:

https://github.com/lsjunior/rockframework/tree/master/rockframework-security/src/test/java/br/net/woodstock/rockframework/security/test

Deve achar lá o que precisa. Tem uma abstração do classe chamada Store, que facilita a escrita e leitura de dados do keystore.

L

Obrigado pela ajuda lsjunior,

Vou estudar o que você tem, e em seguida lhe informo se consegui finalizar.

L

Bom dia Lsjunior,

Você tem essas bibliotecas, para me passar?

import junit.framework.TestCase;

import br.net.woodstock.rockframework.security.ProviderType;

import br.net.woodstock.rockframework.security.store.KeyStoreType;

import br.net.woodstock.rockframework.utils.CollectionUtils;

import br.net.woodstock.rockframework.utils.ConditionUtils;

import br.net.woodstock.rockframework.utils.HexUtils;

import br.net.woodstock.rockframework.utils.StringUtils;

Quero testar o método KeystoreWindowsMSCAPITest.

Obrigado pela atenção

L

É esse projeto ai que te passei, mandei o link github direto no pacote de testes, basta subir alguns níveis para chegar na raiz do projeto.

O link do projeto principal:
https://github.com/lsjunior/rockframework

O link para o módulo de segurança:
https://github.com/lsjunior/rockframework/tree/master/rockframework-security

Só clonar o projeto principal e testar.

L

Bom dia,

Lsjunior, tentei clonar, mas acredito que a rede da empresa esta bloqueando o acesso ao github, carrega até o 9% depois da erro.

Abri o arquivo gerado no notepad, utilizando o ‘getEncoded()’, o arquivo fica praticamente igual ao arquivo correto, porém há alguns caracteres
no cabeçalho que o diferenciam do arquivo correto, se eu retira-los na mão, o arquivo fica na estrutura correta também.

Obs.: Anexado imagem com os dois cabeçalhos.

O que devo fazer para retirar essa escrita do cabeçalho, ou gerar o arquivo corretamente?

Obrigado pela atenção


L

Posta o fonte(um zip) do que vc fez ou manda seu fonte ai pro meu email que te ajudo.

[email removido]

Criado 21 de maio de 2013
Ultima resposta 23 de mai. de 2013
Respostas 9
Participantes 2