如何使用 XADES4j、证书库 windows 和智能卡 + PIN 码签署 xml
How to sign an xml with XADES4j, certificate store windows and Smart Card + PIN Code
我正在尝试使用 XADES4j 签署一个 xml 文件。我也使用智能卡认证(将从windows商店加载)。
是否有符合我搜索条件的示例,因为我是 XML 签名和智能卡的新手。我搜索了几个星期的修复程序但没有成功。
还有其他例子,但不是很清楚:
Example2
我在 https://github.com/luisgoncalves/xades4j/wiki/DefiningKeyingData 找到了这个演示,但我不知道如何设置函数 PKCS11KeyStoreKeyingDataProvider
以应用 Windows 证书参数及其 pin 码:
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);
我不确定您所说的 "Windows store + smart card" 是什么意思,因为两者似乎都是排他性的。反正你要用智能卡,你代码差不多就OK了。
智能卡通常有一个安装在主机上的本机库 OS。在 PKCS11KeyStoreKeyingDataProvider
的第一个参数上,您应该传递该库的路径。第二个参数 (name
) 只是注册提供者实例的名称。由于智能卡通常会处理 PIN 以访问密钥,因此您通常可以为 keyStorePasswordProvider
和 entryPasswordProvider
参数提供 null
。
在库单元测试中,您可以找到 example using the Portuguese citizen card。
希望对您有所帮助。
我正在尝试使用 XADES4j 签署一个 xml 文件。我也使用智能卡认证(将从windows商店加载)。
是否有符合我搜索条件的示例,因为我是 XML 签名和智能卡的新手。我搜索了几个星期的修复程序但没有成功。
还有其他例子,但不是很清楚:
我在 https://github.com/luisgoncalves/xades4j/wiki/DefiningKeyingData 找到了这个演示,但我不知道如何设置函数 PKCS11KeyStoreKeyingDataProvider
以应用 Windows 证书参数及其 pin 码:
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);
我不确定您所说的 "Windows store + smart card" 是什么意思,因为两者似乎都是排他性的。反正你要用智能卡,你代码差不多就OK了。
智能卡通常有一个安装在主机上的本机库 OS。在 PKCS11KeyStoreKeyingDataProvider
的第一个参数上,您应该传递该库的路径。第二个参数 (name
) 只是注册提供者实例的名称。由于智能卡通常会处理 PIN 以访问密钥,因此您通常可以为 keyStorePasswordProvider
和 entryPasswordProvider
参数提供 null
。
在库单元测试中,您可以找到 example using the Portuguese citizen card。
希望对您有所帮助。