Validação de assinatura digital XML
-
05-07-2019 - |
Pergunta
Eu estava tentando validar uma assinatura XML.
A validação de acordo com isso tutorial funciona bem.
Mas eu também tentei uma segunda abordagem. Para verificar com o Verifique o método da classe de assinatura, extraí a assinatura e o certificado do arquivo XML, e eu fiz o seguinte:
public static boolean checkSignedFile(byte[] data, byte[] sigToVerify,
byte[] cert, String algorithm) throws CertificateException,
NoSuchAlgorithmException, InvalidKeyException, SignatureException {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate c = (Certificate) cf
.generateCertificate(new ByteArrayInputStream(cert));
PublicKey pk = c.getPublicKey();
Signature sig;
boolean verifies = false;
sig = Signature.getInstance(algorithm);
sig.initVerify(pk);
sig.update(data);
verifies = sig.verify(sigToVerify);
return verifies;
}
O resultado foi falso. A assinatura não verificou. Qual poderia ser a razão para isso?
Solução
Você não pode verificar o xmldsig como este. Não funcionaria. A assinatura não é calculada sobre o XML bruto. Tem que passar pela canonicalização, digerir etc.
Para que você usa data[]
? Para acertar, você quase precisa reescrever a biblioteca XMLDSIG.
Outras dicas
Se os dados [] são o conteúdo do arquivo XML assinado, o que é sigtoverify?
O XMLSIG cria um elemento de assinatura (SignedInfo) que contém o resumo de cada elemento a ser assinado e meta-informações como algoritmos de canonicalização/transformação usados. Em seguida, a digestão deste SignedInfo-Elennt é calculada e assinada.
Portanto, se o Sigtoverify for a assinatura criada por uma implementação XMLSignature, ela não deve ser igual à assinatura do arquivo XML completo.
Aqui é uma explicação mais completa. E se você estiver interessado, dê uma olhada no especificação.