Подпись JAVA XML с провайдером PKCS11 HSM - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь подписать XML с помощью закрытого ключа в моем HSM, но я получаю сообщение об ошибке, потому что закрытый ключ содержит "конфиденциальную" информацию, поэтому сейчас я пытаюсь использовать мой PKCS11 провайдер для подписи.

Я использую Luna JSP provider.

Вот так я генерирую свою подпись, используя закрытый ключ и из того, что я понимаю с моей ошибкой com.safenetinc.luna.exception.LunaException: Невозможно получить доступ к конфиденциальным атрибутам, мне нужно использовать провайдера PKCS11, чтобы иметь возможность подписи внутри моего HSM, но я не вижу, как реализовать это с XMLSignatureFactory.

XMLSignatureFactory fac;
try {
  fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
}
catch(InstantiationException | IllegalAccessException | ClassNotFoundException e) {
  e.printStackTrace();
}

Reference ref;
SignedInfo si;
try {
  ref = fac.newReference("",
                         fac.newDigestMethod(xmldss.getDigestMethod(), null),
                         Collections.singletonList(fac.newTransform(Transform.ENVELOPED,
                                                                    (TransformParameterSpec) null)),
                         null,
                         null);

  si = fac.newSignedInfo(fac.newCanonicalizationMethod(xmldss.getCanonicalizationMethod(),
                                                       (C14NMethodParameterSpec) null),
                         fac.newSignatureMethod(xmldss.getSignatureMethod(), null),
                         Collections.singletonList(ref));
}
catch(NoSuchAlgorithmException | InvalidAlgorithmParameterException e) {
  e.printStackTrace();
}

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document document;
try {
  document = (dbf.newDocumentBuilder().parse(xmlDocumentStream));
}
catch(SAXException | IOException | ParserConfigurationException e) {
  e.printStackTrace();
}

DOMSignContext dsc = new DOMSignContext(keyPair.getPrivate(), document.getDocumentElement());
dsc.setDefaultNamespacePrefix(xmldss.getDigitalSignerPrefix());

XMLSignature signature = fac.newXMLSignature(si, buildKeyInfo(fac, signatureInfos));
try {
  signature.sign(dsc);
}
catch(MarshalException | XMLSignatureException e) {
  e.printStackTrace();
}

1 Ответ

0 голосов
/ 05 ноября 2018

После копания в DOMXMLSignature я обнаружил, что свойство org.jcp.xml.dsig.internal.dom.SignatureProvider можно использовать для установки провайдера.

Так что мое решение было сделать

Provider lunaProvider = Security.getProvider("LunaProvider");
dsc.setProperty("org.jcp.xml.dsig.internal.dom.SignatureProvider", lunaProvider);
...