簡體   English   中英

帶有PKCS11提供程序HSM的JAVA XML簽名

[英]JAVA XML Signature with PKCS11 provider HSM

我試圖在我的HSM使用私鑰對XML進行簽名,但是由於私鑰包含“敏感”信息,因此出現了錯誤,因此現在嘗試使用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();
}

在深入研究DOMXMLSignature之后,我發現可以使用org.jcp.xml.dsig.internal.dom.SignatureProvider屬性來設置提供程序。

所以我的解決辦法是

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM