Apache POI 是否支持对单词进行两次签名?



我尝试运行签名代码两次,但我发现它只是通用的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();

在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、...当打开 DOX/XLSX 时,所有签名都会在那里。

我已经通过 #63011 修复了原始问题,该问题将在 POI 4.1.0 中发布。

票证的相关部分是。

SignatureConfig.setAllowMultipleSignatures(true)中有一个新的配置属性,允许添加签名,默认情况下为 false 以保持向后兼容。

最新更新