amagovpt / autenticacao.gov

Middleware Oficial de Identificação Eletrónica em Portugal - Cartão de Cidadão, da Chave Móvel Digital e Sistema de Certificação de atributos profissionais
https://www.autenticacao.gov.pt
European Union Public License 1.2
168 stars 33 forks source link

pt.portugal.eid.PTEID_ExCertNoRoot: 'Erro na aplicação.' #58

Open pilhaDePilhas opened 3 years ago

pilhaDePilhas commented 3 years ago

Boas,

segundo a documentação dos Exmos. para a obtenção do certificado root , deverá ser utilizado o método getRoot().

`

        PTEID_ReaderSet.initSDK();
        PTEID_ReaderSet readerSet = PTEID_ReaderSet.instance();
        PTEID_ReaderContext context = readerSet.getReader();

        PTEID_EIDCard card = context.getEIDCard();

        // Get the root certificate from the card
        PTEID_Certificate root = card.getRoot();

`

No entanto, é apresentado o seguinte erro: Exception thrown: 'pt.portugal.eid.PTEID_ExCertNoRoot' in pteidlib_dotnet.dll An unhandled exception of type 'pt.portugal.eid.PTEID_ExCertNoRoot' occurred in pteidlib_dotnet.dll Erro na aplicação.

Algo de errado no meu ambiente? A obtenção dos restantes certificados resulta, apenas e só o certificado root apresenta este erro.

pilhaDePilhas commented 3 years ago

Viva, também já instalei manualmente os certificados presentes na pagina: https://www.scee.gov.pt/rep/certificados/ . Infelizmente sem sucesso.

ACamposPT commented 3 years ago

Viva, Efectivamente existe um problema com o método "card.getRoot()". Vamos adicionar a nossa lista de "backlog" a sua resolução.

Entretanto, para tentar resolver o teu problema e pensando que estejas a construir a cadeia completa, podes ver como nós fazemos isso na nossa aplicação: https://github.com/amagovpt/autenticacao.gov/blob/46c709800ae30a0a4cc7c2cd845f2cb5a0b71038/pteid-mw-pt/_src/eidmw/eidguiV2/gapi.cpp#L3131

Basicamente vamos construindo a cadeia, partindo do certificado do Cidadão e usando o método "cert.getIssuer()" até chegar ao root. Isto funciona para o teu problema? Se não resolver, explica em detalhe o que pretende fazer. Obrigado.

pilhaDePilhas commented 3 years ago

Olá @ACamposPT ,

necessito de assinar um XML sendo que o certificado a usar é o certificado ROOT para obter a privateKey do CC, ou poderei usar também o certificado CA para esse efeito?

agrr commented 3 years ago

Boa tarde, ao assinar um XML o certificado a utilizar para validar a mesma assinatura deverá ser o certificado de assinatura ou de autenticação do cidadão (dependendo do parãmetro boolean passado no método PTEID_EIDCard.Sign), nunca o certificado root da cadeia. Estes certificados podem ser obtidos usando os métodos:

https://amagovpt.github.io/docs.autenticacao.gov/sdk/java/pt/gov/cartaodecidadao/PTEID_Certificates.html#getSignature-- https://amagovpt.github.io/docs.autenticacao.gov/sdk/java/pt/gov/cartaodecidadao/PTEID_Certificates.html#getAuthentication--

O processo que o @ACamposPT apontou no código da nossa aplicação serve para construir a cadeia de certificados completa (pode ser necessária para o cenário específico de validação). A melhoria que queremos implementar numa futura versão do SDK será adicionar um método getCertificateChain na classe PTEID_Certificates que devolva a cadeia completa e ordenada para o certificado de assinatura ou de autenticação.

Atualmente, para fazer isto é necessário chamar sucessivamente o método PTEID_Certificate.getIssuer até obter um objeto PTEID_Certificate que verifique esta condição certificate.isRoot() == true