2017-10-17 8 views
0

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:

Example1 Example2

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); 

Répondre

0

Je ne suis pas sûr de ce que vous entendez par "Windows store + carte à puce" car les deux semblent exclusifs. Quoi qu'il en soit, si vous voulez utiliser une carte à puce, le code est presque OK.

Les cartes à puce possèdent généralement une bibliothèque native installée sur le système d'exploitation hôte. Sur le premier argument de PKCS11KeyStoreKeyingDataProvider, vous devez passer le chemin d'accès à cette bibliothèque. Le deuxième paramètre (name) est juste le nom pour enregistrer l'instance du fournisseur. Étant donné que la carte à puce gère généralement le code confidentiel pour accéder à la clé, vous pouvez généralement fournir null pour les arguments keyStorePasswordProvider et entryPasswordProvider.

Lors des tests unitaires de la bibliothèque, vous pouvez trouver un example using the Portuguese citizen card.

Espérons que cela aide.

+0

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. –

+0

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

+0

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. –