1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
public String signer(String fluxASignerString) throws ServiceTechniqueException {
LOGGER.debug("entree dans la methode");
try {
/** La plupart des objets créés correspondent à des élements XML de la signature */
// création d'une factory pour créer des signatures basées sur le méchanisme DOM et avec le système d'algo DSIG
XMLSignatureFactory signatureFactory = XMLSignatureFactory.getInstance(
ConstantesMetierBackProdDocs.TYPE_MECHANISME_GESTION_XML,
(Provider) ConstantesMetierBackProdDocs.TYPE_ORGANISATION_SIGNATURE_XML.clone());
Reference reference = signatureFactory.newReference("", signatureFactory.newDigestMethod(DigestMethod.SHA1, null), Collections.singletonList(signatureFactory.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null)), null, null);
LOGGER.debug("creation du signedInfo avec les methodes de traitement");
// regroupement des "vrais" algos et des algo pour affichage dans le XML
SignedInfo signedInfo = signatureFactory.newSignedInfo(signatureFactory.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS, (C14NMethodParameterSpec) null), signatureFactory.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(reference));
LOGGER.debug("creation du document builder");
// lecture du XML et récupération du premier élement
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
LOGGER.debug("parsing du contenu du fichier et convertion en DOM");
Document document = documentBuilderFactory.newDocumentBuilder().parse(new InputSource(new StringReader(fluxASignerString)));
LOGGER.debug("creation des eventuelles balises manquantes pour insérer la signature");
signatureHelper.creerBalisesSignature(document);
LOGGER.debug("recuperation de la cle privée");
// récupération de la clé privée
Key key = signatureHelper.getPrivateKey(ConstantesMetierBackProdDocs.PATH_PRIVATE_KEY);
// définition du contexte de signature avec la clé privée et l'élement à signer
DOMSignContext signContext = new DOMSignContext(key, document.getDocumentElement());
//signContext.setURIDereferencer(XMLSignatureFactory.getInstance().getURIDereferencer());
// création de la factory basé sur la méthode DOM avec l'algo DSIG
KeyInfoFactory keyFactory = KeyInfoFactory.getInstance(
ConstantesMetierBackProdDocs.TYPE_MECHANISME_GESTION_XML,
(Provider) ConstantesMetierBackProdDocs.TYPE_ORGANISATION_SIGNATURE_XML.clone());
LOGGER.debug("recuperation du certificat");
// Récupération du certificat
X509Certificate certificate = signatureHelper.getCertificate(ConstantesMetierBackProdDocs.PATH_CERTIFICAT);
LOGGER.debug("creation du keyinfo");
// futur élement du keyinfo
KeyInfo keyInfo = signatureHelper.getKeyInfo(certificate, keyFactory);
// création de la signature
XMLSignature signature = signatureFactory.newXMLSignature(signedInfo, keyInfo);
LOGGER.debug("SIGNATURE");
// signature du contexte
signature.sign(signContext);
LOGGER.debug("deplacement de la signature");
// on extrait le noeud de signature car il n'est pas placé au bon endroit
Element signatureElement = signatureHelper.enleverSignatureElement(document);
// on ajoute le noeud de signature au bon endroit
signatureHelper.ajouterSignatureElement(document, signatureElement);
LOGGER.debug("convertion du document OBJET => String");
String fluxSigneString = signatureHelper.getStringPourDocument(document);
LOGGER.debug("sortie de la methode");
return fluxSigneString;
} catch (NoSuchAlgorithmException e) {
LOGGER.error(e.getMessage(), e);
throw new ServiceTechniqueException(e.getMessage(), e);
} catch (InvalidAlgorithmParameterException e) {
LOGGER.error(e.getMessage(), e);
throw new ServiceTechniqueException(e.getMessage(), e);
} catch (IOException e) {
LOGGER.error(e.getMessage(), e);
throw new ServiceTechniqueException(e.getMessage(), e);
} catch (SAXException e) {
LOGGER.error(e.getMessage(), e);
throw new ServiceTechniqueException(e.getMessage(), e);
} catch (ParserConfigurationException e) {
LOGGER.error(e.getMessage(), e);
throw new ServiceTechniqueException(e.getMessage(), e);
} catch (XMLSignatureException e) {
LOGGER.error(e.getMessage(), e);
throw new ServiceTechniqueException(e.getMessage(), e);
} catch (MarshalException e) {
LOGGER.error(e.getMessage(), e);
throw new ServiceTechniqueException(e.getMessage(), e);
}
} |
Partager