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

时间:2018-09-13 07:50:55

标签: java apache-poi digital-signature

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

2 个答案:

答案 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,以保持向后兼容。