Deu certo em parte, pois agora não está mais dando ‘0’, aí quando nessa parte abaixo para tentar validar a XMLSignature da erro.
XMLSignature signatures = fac.unmarshalXMLSignature(valContext);
// Valida a XMLSignature.
boolean coreValidity = signatures.validate(valContext);
Agora está dando esse erro javax.xml.crypto.dsig.XMLSignatureException: cannot find validation key, será que vou precisar do certificado digital? Pois no momento tenho apenas o xml.
Tentei fazer dessa forma que mandou, porém o meu arquivo do certificado é .pfx, aí retorna o seguinte erro ‘java.security.cert.CertificateParsingException: signed fields invalid’
Tentei usar dessa maneira para poder obter o certificado, mas também recebo o mesmo erro.
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = new FileInputStream("/home/aline/Documents/Certificado/Script/certificado.pfx");
BufferedInputStream bis = new BufferedInputStream(fis);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate cert = null;
while (bis.available() > 0) {
cert = cf.generateCertificate(bis);
trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}
PublicKey publicKey = cert.getPublicKey();
Vc não carregou o arquivo pfx, precisa trocar para algo como:
// para ler PFX, usar o tipo PKCS12
KeyStore trustStore = KeyStore.getInstance("PKCS12");
// abrir o arquivo
InputStream fis = new FileInputStream("/home/aline/Documents/Certificado/Script/certificado.pfx");
// carregar o kesytore com o conteúdo do arquivo
// usar a senha do keystore (ou null caso não tenha)
trustStore.load(fis, "senha_do_keystore".toCharArray());
// usar o alias no qual o certificado está
// se não souber o alias, pode usar o método aliases() para verificar todos que existem,
// e aí escolher o correto
Certificate cert = trustStore.getCertificate("alias_do_certificado");
// ... usar o certificado
O código que vc fez carrega um keystore vazio (load(null)), e depois tenta ler o arquivo pfx como se fosse um certificado (pois vc passa o input stream para o CertificateFactory, ou seja, ele vai tentar ler o arquivo PFX como se fosse um certificado).
Seu código só funcionaria se no lugar do arquivo pfx tivesse um arquivo contendo somente o certificado (o que não é o caso). Ah, e depois o seu código tenta colocar o certificado dentro do PFX (é o que o método setCertificateEntry faz), mas isso não faz sentido porque entendi que o PFX já tem o certificado, certo?
Sendo bem sincero - e sem ironia nenhuma - sugiro voltar alguns passos e estudar o básico de certificados digitais, em vez de tentar coisas aleatórias sem entender o que está fazendo (desculpe se parece rude, mas esta é a impressão que passa). E programar dessa forma (também chamado de “programação orientada a coincidências”) nunca é a melhor alternativa.
Não sei o quanto vc já conhece do assunto, e é difícil indicar links sem saber disso, mas enfim, talvez ajude: