[RESOLVIDO] Leitura de Certificado Digital diretamente do Smart Card

Bom dia galera estou tentando acessar um certificado digital diretamente do smartcard por meio de comando APDU, porém ainda não tive sucesso para localizar o mesmo.

Lista : [PC/SC terminal Alcor Micro USB Smart Card Reader 0]
Terminal Selecionado: Alcor Micro USB Smart Card Reader 0
card: PC/SC card in Alcor Micro USB Smart Card Reader 0, protocol T=0, state OK
ATR : 3B7F96000080318065B084413DF612004C829000
APDU: 0x00:0xA4:0x04:0x00
Resposta: 0x6A86

Alguém que já tenha feito algo parecido por favor me auxilie nesta questão.

Boa tarde, estou de volta para responder meu próprio tópico…kkkkkkkkkkkkk

Existe muito conteúdo sobre este assunto na internet e muitos tratam o assunto de forma genérica, vou tentar colocar de forma sucinta o que fiz para resolver este problema de forma que outras pessoas consigam realizar o mesmo.

Vamos entender a situação, ler um certificado digital em smart card. Para fazer a leitura dos certificados contidos nesses cartões é necessário utilizar a biblioteca compatível com a criptografia utilizada pelo mesmo, no meu caso PKCS#11.

Além disto é necessário utilizar uma dll que contém o métodos para acessar o certificado dentro do cartão, essa dll é a “aetcrss1.dll” ela vem no pacote de instalação do “SafeSign Standard” e um alerta básico para qualquer um quer tente utilizar essa biblioteca, não importa se o sistema é x64, NÃO VAI FUNCIONAR, em sistema x64 você deve utilizar a dll para sistemas x32 e só assim a leitura de certificados via código irá funcionar.

Demorei muito para chegar nesse ponto e finalmente consigo fazer a leitura dos certificados e assinar documentos com os mesmos e agora espero que este tópico ajude outras pessoas.

:metal::sunglasses::metal:

1 curtida

olá Villagram

vc poderia mandar o arquivo, não to encontrando ele, uso sistema operacional linux

Sistemas linux não usam arquivos .dll e sim .so, não sei se vou ter esse arquivo, mas vou dar uma olhada.

Bom dia to tentando usar umas dlls e a principio ta lendo sim.

Se vc não se importar e me passar para tentar usar agradeço

Coloquei o link aqui, mas só tenho para windows mesmo:

Não posso deixar no ar por muito tempo, então vou apagar o link em um mês.

acho q o arquivo ta corrompido, baixei mas na hora de abrir parece que ta vazio

o download foi de 4.7 mb

e pelo que vi não tem esse arquivo nas listas aetcrss1.dll, como mencionado no teu post de solução

Este arquivo está dentro do arquivo que disponibilizei. O instalador da safesign é só baixar no site.

Já upei um novo arquivo em zip em vez de rar.

Desculpe já baixei o instalador e o mesmo não está, ao menos não encontrei com o nome que vc mencionou

o download deu certo, só não encontrei este arquivo

esse arquivo não vai estar dentro da pasta do software, ele é inserido dentro da pasta do sistema operacional, no caso do windows é na pasta System32 ou SysWOW64, porém esses arquivos estão dentro do arquivo que disponibilizei.

a ok me confundi com os nomes, é o sss1 e não rss1

Perfeito, obrigado pela ajuda Villagram

Sem problemas, o nome que coloquei está faltando um “s” mesmo. Espero que consiga acessar o cartão.

2 curtidas

Não vai rolar mesmo, esse arquivo eu já tinha, talvez porque as DLL’s não estão no padrão JNI

Obrigado mesmo assim Villagram

Não sei o que te dizer, eu consegui dessa forma, acesso a leitora do cartão leio as informações do cartão e assino documentos. O que posso fazer é deixar um pouco do meu código aqui.

{

public class CertificadoDigital {

private final String LIBRARY_PATH = Utilidades.getCurrentPath().concat("\\lib\\smartcardReader\\64bits\\aetpkss1.dll");
private final String READER_CONFIG = "name = SmartCard\nlibrary = " + LIBRARY_PATH;
private Certificate certificate = null;
private Provider provider;

public CertificadoDigital() {
}

public Provider getProvider() {
    try {
        if (provider != null) {
            return provider;
        }
        ByteArrayInputStream confStream = new ByteArrayInputStream(READER_CONFIG.getBytes());
        provider = new SunPKCS11(confStream);
        return provider;
    } catch (Exception ex) {
        ex.printStackTrace();
        return null;
    }
}

public boolean isSmartcardPresent() {
    try {
        getProvider();
        try {
            KeyStore keyStore = KeyStore.getInstance("PKCS11", provider);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

public KeyStore getKeyStore(Provider provider, String senha) {
    try {
        KeyStore keyStore = KeyStore.getInstance("PKCS11", provider);
        keyStore.load(null, senha.toCharArray());
        return keyStore;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

public Certificate getCertificado(String senha) {
    if (certificate == null) {
        try {
            KeyStore keyStore = getKeyStore(getProvider(), senha);
            certificate = keyStore.getCertificate(entidade);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return certificate;
}

public PublicKey getPublicKey(String senha) {
    try {
        return getCertificado(senha).getPublicKey();
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

public void dispose() {
    try {
        provider.clear();
        if (provider.isEmpty()) {
            provider = null;
        }
    } catch (Exception e) {
    }
}
}

}

Agradeço novamente o código é o mesmo, ta um erro de inicialização do cabeçalho

invalid elf header

Esse erro é de formato de arquivo, como eu lhe disse dlls não funcionam no linux…você precisa do arquivo libaetpkss.so