Не работает улучшение подписей до CAdES-A
Есть подписи (CAdES-BES, CAdES-XLT1) сформированные через CAdESCOM (или .Net-ный SignedCms).
Подписи успешно проверяются через JCP и корректно определяется их тип.
Подписи CAdES-BES успешно улучшаются до CAdES-XLT1 через вызов enhance.
При попытке улучшить подпись до CAdES-A валится ошибка:
Timestamp is invalid; error codes: [34] 'Timestamp is invalid',
at ru.CryptoPro.CAdES.CAdESSignerXLT1Impl.enhance(Unknown Source)
at ru.CryptoPro.CAdES.CAdESSignerXLT1Impl.enhance(Unknown Source)
at ru.CryptoPro.CAdES.CAdESSignerBESImpl.enhance(Unknown Source)
at Crypto.SignatureMethods.enhanceSignatureInternal(SignatureMethods.java:275)
Caused by: Timestamp is invalid; error codes: [34] 'Timestamp is invalid', {Archive-timestamp-V3 has invalid imprint (digest); error codes: [120] 'Archive-timestamp-V3 has invalid imprint (digest)', }
at ru.CryptoPro.CAdES.CAdESSignerAImpl.f(Unknown Source)
at ru.CryptoPro.CAdES.CAdESSignerAImpl.verify(Unknown Source)
at ru.CryptoPro.CAdES.CAdESSignerAImpl.verify(Unknown Source)
at ru.CryptoPro.CAdES.CAdESSignerAImpl.verify(Unknown Source)
При этом, если тем же сертификатом подписывать изначально через JCP, то ошибки нет, т.е. подпись, изначально сформированная через JCP - успешно улучшается.
Используется версия jcp-2.0.41940-A
Адрес службы таймстампов:
http://cryptopro.ru/tsp/tsp.srfКод написан на базе примера:
private byte[] enhanceSignatureInternal(Configuration config, byte[] signatureBytes, byte[] contentBytes, byte[] certBytes, Integer targetCadesType) throws CAdESException {
CAdESSignature signature = new CAdESSignature(signatureBytes, contentBytes, null);
// Список всех подписантов в исходной подписи.
var srcSignerInfos = new ArrayList<SignerInformation>();
CAdESSigner[] signers = signature.getCAdESSignerInfos();
for (CAdESSigner signer : signers) {
srcSignerInfos.add(signer.getSignerInfo());
}
// Получаем только первую подпись, усовершенствуем ее. Остальных не трогаем.
CAdESSigner signer = signature.getCAdESSignerInfo(0);
// Исключаем ее из исходного списка, т.к. ее место займет усовершенствованная подпись.
srcSignerInfos.remove(signer.getSignerInfo());
// Усовершенствуем до CAdES-A.
String digestAlgOID = signer.getSignerInfo().getDigestAlgOID();
AttributeTable unsignedAttributes = signer.getSignerUnsignedAttributes();
var cert = certificateFromByte(certBytes);
var chain = new LinkedList<X509Certificate>();//config.getChain());
chain.add(cert);
try {
signer = signer.enhance(config.getProviderName(),
digestAlgOID, //config.getDigestOid(),
chain,
config.getTSAAddress(), //
http://cryptopro.ru/tsp/tsp.srf targetCadesType);//CAdESType.CAdES_A);//,
//unsignedAttributes);
} catch (CAdESException e) {
logError(e);
}
// Подписант усовершенствованной подписи.
SignerInformation enhSigner = signer.getSignerInfo();
// Добавляем его в исходный список подписантов.
srcSignerInfos.add(enhSigner);
// Список подписантов.
SignerInformationStore dstSignerInfoStore = new SignerInformationStore(srcSignerInfos);
ByteArrayOutputStream newCMSSignedDataBuffer = new ByteArrayOutputStream();
InputStream srcSignedDataStream = new ByteArrayInputStream(signatureBytes);
// Обновляем исходную подпись c ее начальным списком подписантов на тот же, но с первым подписантом с усовершенствованной подписью.
CAdESSignature.replaceSigners(srcSignedDataStream, dstSignerInfoStore, newCMSSignedDataBuffer);
return newCMSSignedDataBuffer.toByteArray();
}
Подскажите пожалуйста, в чем может быть проблема?