J'essaye de signer un fichier xml en utilisant le XADES4j. J'utilise également la certification de la carte à puce (sera chargée à partir du magasin Windows).Comment signer un fichier XML avec XADES4j, les fenêtres du magasin de certificats et la carte à puce + code PIN
Existe-t-il un exemple répondant à ma recherche, car je suis nouveau avec la signature XML et les cartes à puce. J'ai cherché un correctif pendant quelques semaines sans succès.
Il y a d'autres par exemple à ce sujet, mais il est pas très clair:
Je trouve cette démonstration à https://github.com/luisgoncalves/xades4j/wiki/DefiningKeyingData, mais je ne sais pas comment définir la fonction PKCS11KeyStoreKeyingDataProvider
pour appliquer Windows paramètres de certificat et leur code pIN:
KeyingDataProvider kp = new PKCS11KeyStoreKeyingDataProvider(
"path/to/native/lib",
"MS SABRI", // CERTIFICATE NAME
new FirstCertificateSelector(),
null,
null,false);,
Mon code:
try {
// >>> TEST N°1
// KeyingDataProvider kp = new DirectKeyingDataProvider((X509Certificate) certExemple, PrivateKEY);
// >>> TEST N°2
KeyingDataProvider kp = new PKCS11KeyStoreKeyingDataProvider(
"path/to/native/lib",
"name", // CERTIFICATE NAME
new FirstCertificateSelector(),
new DirectPasswordProvider("123456"), // PIN CODE
new DirectPasswordProvider("123456"), // PIN CODE
false);
// XADES
XadesSigningProfile p = new XadesBesSigningProfile(kp);
XadesSigner signer = p.newSigner();
javax.xml.parsers.DocumentBuilderFactory factory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
javax.xml.parsers.DocumentBuilder builder = null;
builder = factory.newDocumentBuilder();
// XML FILE TO BE SIGNED
Document doc1 = builder.parse(new File("FileNotSigned.xml"));
// NODE
Node parentElement = doc1.getDocumentElement();
Node nodeToSign = doc1.getDocumentElement().getFirstChild();
Node nodeToAttachSignature = doc1.getDocumentElement();
IndividualDataObjsTimeStampProperty dataObjsTimeStamp = new IndividualDataObjsTimeStampProperty();
AllDataObjsCommitmentTypeProperty globalCommitment = AllDataObjsCommitmentTypeProperty.proofOfApproval();
CommitmentTypeProperty commitment = CommitmentTypeProperty.proofOfCreation();
// XPATH STRING
String xpathHeader ="/InvoiceHeader";
String xpathBody ="/InvoiceBody";
// OBJECT
DataObjectDesc obj1 = new DataObjectReference("");
obj1.withTransform(XPath2Filter.intersect(xpathHeader).intersect(xpathBody));
SignedDataObjects dataObjs = new SignedDataObjects(obj1);
// SIGN
signer.sign(dataObjs, nodeToAttachSignature);
// TRANSFORMER
Transformer transformer = TransformerFactory.newInstance().newTransformer();
// XML SIGNED
Result output = new StreamResult(new File("FileSigned.xml"));
Source input = new DOMSource(doc1);
transformer.transform(input, output);
Merci Luis pour votre aide. J'ai réussi à faire la signature avec succès. Mais lors de la vérification du fichier xml du fournisseur de certificat, il m'a envoyé cette réponse: "Erreur lors de la sécuritéController: java.lang.String ne peut pas être converti en java.security.cert.X509Certificate". Pouvez-vous me dire la cause de cette erreur? et comment pouvons-nous le résoudre? Merci encore Luis. –
L'exception semble assez évidente .. formez la trace de la pile, vous devriez être capable de trouver la ligne de code qui cause ce problème .. Ne semble pas être un problème avec xades4j, mais laissez-moi savoir si c'est le cas. – lgoncalves
Oui, ça ne semble pas être un problème avec xades4j. J'ai supprimé le bloc et le problème est résolu. J'ai encore d'autres problèmes de vérification de signature (côté fournisseur de certificat) et je les vérifie toujours. Exemple: Je dois garder une seule référence dans le bloc de signature (référence que j'ai créée contient le XPATH2), donc éliminer le code qui crée la référence automatique qui regroupe le bloc SignedProperties: normalement cela ne crée pas de problèmes n'est-ce pas? . J'attends votre aide si j'ai rencontré une erreur de blocage bientôt! Merci encore Luis. –