Поддерживает ли Apache POI двойное подписание слова? - PullRequest
0 голосов
/ 13 сентября 2018

Я дважды пытался запустить код подписи, но обнаружил, что это просто общий 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 голосов
/ 08 марта 2019

Я исправил исходную проблему через # 63011 , которая будет выпущена в POI 4.1.0.

Соответствующая часть билета.

В SignatureConfig.setAllowMultipleSignatures(true) есть новое свойство конфигурации, позволяющее добавлять подписи, которое по умолчанию имеет значение false, чтобы оставаться обратно совместимым.

0 голосов
/ 12 декабря 2018

Внутри org.apache.poi.poifs.crypt.dsig.SignatureInfo есть метод writeDocument (Document document), который создает sig1.xml, переопределяющий предыдущий (если есть), поэтому, если вы подпишете его несколько раз,Вы увидите только последнюю подпись, хотя внутри _xmlsignatures / _rels / origin.sigs.rels документа docx / xlsx вы можете увидеть отношение к каждой подписи.

если вы замените:

 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 все подписи будут там.

...