我尝试两次运行签名代码,但是我发现它只是一般的sig1.xml,而不是sig1.xml和sig2.xml。
char password[] = "test".toCharArray();
File file = new File("test.pfx");
KeyStore keystore = KeyStore.getInstance("PKCS12");
FileInputStream fis = new FileInputStream(file);
keystore.load(fis, password);
fis.close();
// extracting private key and certificate
String alias = "xyz"; // alias of the keystore entry
Key key = keystore.getKey(alias, password);
X509Certificate x509 = (X509Certificate)keystore.getCertificate(alias);
// filling the SignatureConfig entries (minimum fields, more options are available ...)
SignatureConfig signatureConfig = new SignatureConfig();
signatureConfig.setKey(keyPair.getPrivate());
signatureConfig.setSigningCertificateChain(Collections.singletonList(x509));
OPCPackage pkg = OPCPackage.open(..., PackageAccess.READ_WRITE);
signatureConfig.setOpcPackage(pkg);
// adding the signature document to the package
SignatureInfo si = new SignatureInfo();
si.setSignatureConfig(signatureConfig);
si.confirmSignature();
答案 0 :(得分:0)
在org.apache.poi.poifs.crypt.dsig.SignatureInfo中,有一个writeDocument(Document document)方法可创建sig1.xml来覆盖前一个(如果有的话),这就是如果您多次对其进行签名的原因只会在docx / xlsx的_xmlsignatures / _rels / origin.sigs.rels内部完全看到最后一个签名,您可以看到与每个签名的关系。
如果您替换:
sigPartName = PackagingURIHelper.createPartName("/_xmlsignatures/sig1.xml");
类似:
SignatureInfo si = new SignatureInfo();
si.setSignatureConfig(signatureConfig);
Iterator<?> iterator = si.getSignatureParts().iterator();
int i = 1;
while (iterator.hasNext()) {
iterator.next();
i++;
}
sigPartName = PackagingURIHelper.createPartName("/_xmlsignatures/sig" + i + ".xml");
它将创建sig1.xml,sig2.xml等。打开docx / xlsx时,所有签名都将存在。
答案 1 :(得分:0)
我已通过#63011修复了原始问题,该问题将在POI 4.1.0中发布。
机票的相关部分是
SignatureConfig.setAllowMultipleSignatures(true)
中有一个新的config属性,允许添加签名,默认情况下为false,以保持向后兼容。