demoiselle / signer

Repositório que contém os componentes para facilitar a implementação de assinatura digital nos padrões da ICP-BRASIL
https://www.frameworkdemoiselle.gov.br/v3/signer/
GNU Lesser General Public License v3.0
148 stars 73 forks source link

O tamanho das informações extras do certificado não está correto. Dever ser igual a 2 #417

Open icemagno opened 3 months ago

icemagno commented 3 months ago

Quando eu faço isso:

Enumeration<String> e = keyStore.aliases();
String issuer = "";
while (e.hasMoreElements() && issuer.indexOf("CN=Autoridade Certificadora de Defesa") < 0) {
    alias = e.nextElement();
    logger.info("Pegando o certificado do alias " + alias);
    X509Certificate certificate = (X509Certificate) keyStore.getCertificate(alias);

    CertificateManager  cm = new CertificateManager( cert );
    CertICPBrasil cert = cm.load(CertICPBrasil.class);

    logger.info("  Nome.........:" + cert.getNome());
    logger.info("  CPF..........:" + cert.getCpf());
    logger.info("  ID...........:" + cert.getId());
    logger.info("  CEI..........:" + cert.getCei());
    logger.info("  BIRTH........:" + cert.getBirthDate());
    logger.info("  E-mail.......:" + cert.getEmail());
    logger.info("  Cert-Level...:" + cert.getCert_level());
    logger.info("  Cert-Type....:" + cert.getCert_type());
    logger.info("  ID Dispacher.:" + cert.getId_dispatcher());
    logger.info("  UF Dispacher.:" + cert.getUf_dispatcher());    

    issuer = certificate.getIssuerX500Principal().getName("RFC1779");
    logger.info(issuer);
}

Eu recebo o erro: O tamanho das informações extras do certificado não está correto. Dever ser igual a 2 e os dados do certificado vem apenas com nome e certLevel.

Mas se eu faço isso:

logger.info("Validando a assinatura");
CAdESChecker checker = new CAdESChecker();
AttachedContentValidation acv = checker.getAttached(signed, true);
byte[] content = acv.getExtractedContent();
List<SignatureInformations> sigData = acv.getSignaturesInfo();
logger.info("Assinado por: ");
for (SignatureInformations si : sigData) {
    CertificateManager cm = new CertificateManager( si.getIcpBrasilcertificate().getX509Certificate() );
    CertICPBrasil cert = cm.load(CertICPBrasil.class);
    logger.info("  Nome.........:" + cert.getNome());
    logger.info("  CPF..........:" + cert.getCpf());
    logger.info("  ID...........:" + cert.getId());
    logger.info("  CEI..........:" + cert.getCei());
    logger.info("  BIRTH........:" + cert.getBirthDate());
    logger.info("  E-mail.......:" + cert.getEmail());
    logger.info("  Cert-Level...:" + cert.getCert_level());
    logger.info("  Cert-Type....:" + cert.getCert_type());
    logger.info("  ID Dispacher.:" + cert.getId_dispatcher());
    logger.info("  UF Dispacher.:" + cert.getUf_dispatcher());          
}

Os dados do certificado vem todos completos. O Token, Alias e KeyStore são exatamente os mesmos, sendo que o primeiro código eu pego ANTES de assinar e o segundo código eu pego do PKCS#7 assinado por ele.

Qual é a diferença nesse caso?

esaito commented 3 months ago

Percebi que esse erro ocorre com JRE acima da versão 17. Me parece que seja na forma como o certificado é armazenado no keystore daquele que fica na assinatura, e que diante disso alguma classe da JRE que é usada pelo BouncyCastle interpreta diferente.

icemagno commented 3 months ago

Alguma linha de ação? Posso tentar resolver aqui e te passo a solução. Mas preciso de um norte.

esaito commented 3 months ago

De imediato, só baixando a versão da JRE que estiver usando.

Para resolver isso completamente serão dois grandes passos a serem feitos. 1 - Atualizar o Demoiselle-Signer para utilizar a versão mais atual do Java, desse passo a parte mais complicada é o PKCS11 que mudou bastante, e a parte de leitura das libs do dispositivos (token, leitura, nuvem, etc...) terá que ser revisitada. 2 - O segundo passo será a atualização para o BouncyCastle mais atual, que também demanda atualização de código, se não me enganei tem alguém na comunidade que se dispôs a ver isso.