代码之家  ›  专栏  ›  技术社区  ›  JDChi

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

  •  3
  • JDChi  · 技术社区  · 6 年前

    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 回复  |  直到 6 年前
        1
  •  0
  •   Adrião Neves    6 年前

    在org.apache.poi.poifs.crypt.dsig.SignatureInfo中,有一个方法writeDocument(文档文档)创建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");
    

        2
  •  0
  •   kiwiwings    6 年前

    我已经通过 #63011

    这张票的相关部分是。

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