Как подписать XML с помощью XADES4j, окон хранилища сертификатов и смарт-карты + PIN-код
Я пытаюсь подписать XML-файл, используя XADES4j. Я также использую сертификацию смарт-карты (будет загружен из магазина Windows).
Есть ли пример, который соответствует моему поиску, потому что я новичок в XML-подписи и смарт-картах. Я искал исправление в течение нескольких недель безуспешно.
Есть и другие примеры, но это не очень понятно:
Я нашел эту демонстрацию на 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
аргументы.
В модульных тестах библиотеки вы можете найти пример, используя карточку гражданина Португалии.
Надеюсь это поможет.