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
173 stars 33 forks source link

Novos CC: java.security.InvalidKeyException: Not an RSA key: EC #185

Closed AndreasPilgrim closed 1 month ago

AndreasPilgrim commented 1 month ago

Boa tarde,

Aquando de assinatura digital com SDK Java com um novo Cartão de Cidadão, recebo a exception:

java.security.InvalidKeyException: Not an RSA key: EC at sun.security.rsa.RSAKeyFactory.engineTranslateKey(Unknown Source) at sun.security.rsa.RSAKeyFactory.toRSAKey(Unknown Source) at sun.security.rsa.RSASignature.engineInitSign(Unknown Source) at sun.security.rsa.RSASignature.engineInitSign(Unknown Source) at java.security.Signature$Delegate.init(Unknown Source) at java.security.Signature$Delegate.chooseProvider(Unknown Source) at java.security.Signature$Delegate.engineInitSign(Unknown Source) at java.security.Signature.initSign(Unknown Source) at org.jcp.xml.dsig.internal.dom.DOMSignatureMethod.sign(Unknown Source)

O método de implementação da assinatura é com PKCS11 conforme o vosso manual. Podem auxiliar?

agrr commented 1 month ago

Bom dia,

as chaves do novo Cartão de Cidadão usam algoritmo de assinatura diferente, ECDSA em vez de RSA.

Uma lógica deste género funciona para suportar as 2 gerações de cartões assumindo que o software/sistema que processa estas assinaturas está preparado para verificar também assinaturas ECDSA:

if (key.getAlgorithm().equals("RSA")) {
  //Assinar com o algoritmo "SHA256withRSA"
}
else if (key.getAlgorithm().equals("EC")) {
  //Assinar com o algoritmo "SHA256withECDSA"
}

A lista de algoritmos disponíveis nos novos CCs está nos comentários do seguinte excerto de código do manual:

AndreasPilgrim commented 1 month ago

Boa tarde,

Confirmo que da forma que mencionou já fica funcional.

Muito obrigado pelo auxílio.