【问题标题】:Does Apache POI support signing the word twice?Apache POI 是否支持对单词进行两次签名?
【发布时间】:2019-02-17 21:51:48
【问题描述】:

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

【问题讨论】:

    标签: java apache-poi digital-signature


    【解决方案1】:

    在 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 时所有的签名都会在那里。

    【讨论】:

      【解决方案2】:

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

      票证的相关部分是。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多