Как подписать XML с помощью XADES4j, окон хранилища сертификатов и смарт-карты + PIN-код

Я пытаюсь подписать XML-файл, используя XADES4j. Я также использую сертификацию смарт-карты (будет загружен из магазина Windows).

Есть ли пример, который соответствует моему поиску, потому что я новичок в XML-подписи и смарт-картах. Я искал исправление в течение нескольких недель безуспешно.

Есть и другие примеры, но это не очень понятно:

Пример1 Пример2

Я нашел эту демонстрацию на https://github.com/luisgoncalves/xades4j/wiki/DefiningKeyingData, но я не знаю, как установить функцию PKCS11KeyStoreKeyingDataProvider применить параметры сертификата Windows и их пин-код:

    KeyingDataProvider kp = new PKCS11KeyStoreKeyingDataProvider(
              "path/to/native/lib",
               "MS SABRI", // CERTIFICATE NAME
               new FirstCertificateSelector(),
               null, 
               null,false);, 

Мой код:

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

1 ответ

Решение

Я не уверен, что вы подразумеваете под "Магазин Windows + смарт-карта", поскольку оба кажутся эксклюзивными. Во всяком случае, если вы хотите использовать смарт-карту, ваш код почти в порядке.

Смарт-карты обычно имеют встроенную библиотеку, которая установлена ​​на хост-ОС. По первому аргументу PKCS11KeyStoreKeyingDataProvider Вы должны передать путь к этой библиотеке. Второй параметр (name) это просто имя для регистрации экземпляра провайдера. Поскольку смарт-карта обычно обрабатывает PIN-код для доступа к ключу, вы обычно можете предоставить null для keyStorePasswordProvider а также entryPasswordProvider аргументы.

В модульных тестах библиотеки вы можете найти пример, используя карточку гражданина Португалии.

Надеюсь это поможет.

Другие вопросы по тегам