带有 PKCS11 提供程序 HSM 的 JAVA XML 签名

我正在尝试XML使用我的私钥进行签名,HSM但我收到一个错误,因为私钥包含“敏感”信息,所以现在我正在尝试使用我的PKCS11提供商进行签名。


我正在使用Luna JSP provider.


这就是我使用私钥生成签名的方式,根据我对错误的理解 com.safenetinc.luna.exception.LunaException: 无法访问敏感属性,我需要使用PKCS11提供程序才能在我的内部签名,HSM但我没有t 看看如何使用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();

}


慕标5832272
浏览 125回答 1
1回答

LEATH

深入研究后,DOMXMLSignature我发现该属性org.jcp.xml.dsig.internal.dom.SignatureProvider可用于设置提供程序。所以我的解决办法是做Provider lunaProvider = Security.getProvider("LunaProvider");dsc.setProperty("org.jcp.xml.dsig.internal.dom.SignatureProvider", lunaProvider);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java