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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top