[quote=philler]Pessoal, o miolo do método de assinatura está abaixo.
Notem que as variáveis locais devem ser carregadas conforme seu gosto, tipo usarToken para mim é
um boolean que informa o uso de A3, etc…
Espero que entendam.
Qualquer coisa, mandem msg em pvt.
Alencar
[code]
// previne contra &, < e >
xml = Utils.caracterToHTML(xml);
try {
// gera o DOM XMLSignatureFactory que sera usado para gerar o
// envelope
// com.sun.org.apache.xalan.internal.xsltc.DOM
String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI");
fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
// cria uma referencia ao envelope e define o algoritmo SHA1
Reference ref = fac.newReference("", fac.newDigestMethod(DigestMethod.SHA1, null), Collections.singletonList(fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null)), null, null);
// cria o SignedInfo que sera assinado
SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null), fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref));
// gera o KeyInfo
X509Certificate certif;
if (!usarToken) {
certif = (X509Certificate) this.getCertificateFromFile(file, alias, senhaContainer);
} else {
certif = (X509Certificate) this.getCertificateFromToken(senhaContainer);
}
KeyInfoFactory kif = fac.getKeyInfoFactory();
List x509Content = new ArrayList();
x509Content.add(certif.getSubjectX500Principal().getName());
x509Content.add(certif);
X509Data xd = kif.newX509Data(x509Content);
KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
// instancia o documento a ser assinado
ByteArrayInputStream xmlSource = new ByteArrayInputStream(xml.getBytes("UTF-8"));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
doc = docBuilder.parse(xmlSource);
// cria o DOMSignContext informando a private key
DOMSignContext dsc = new DOMSignContext(pk, doc.getDocumentElement());
// cria a assinatura do xml
XMLSignature signature = fac.newXMLSignature(si, ki);
// assina o xml
signature.sign(dsc);
return XMLUtils.DocumentToString(doc);
} catch (Exception e) {
e.printStackTrace();
throw new Exception(e.getMessage());
}
[/code][/quote]
Aí galera… to tendo problemas com essa parte nesse código:
String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI");
fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
Está me retornando: java.lang.ClassNotFoundException: org.jcp.XML.dsig.internal.dom.XMLDSigRI
Mas eu já vi que essa classe existe no rt.jar.
Alguém sabe me explicar se é preciso pegar a classe de alguma outra biblioteca, ou se tem alguma outra configuração que eu deixei passar???
Obrigado