XAdESLevelUpgradeService.java
package io.mersel.dss.signer.api.services.signature.xades;
import eu.europa.esig.dss.enumerations.DigestAlgorithm;
import eu.europa.esig.dss.model.DSSDocument;
import eu.europa.esig.dss.spi.validation.CertificateVerifier;
import eu.europa.esig.dss.xades.XAdESSignatureParameters;
import eu.europa.esig.dss.xades.XAdESTimestampParameters;
import eu.europa.esig.dss.xades.signature.XAdESLevelA;
import io.mersel.dss.signer.api.models.enums.DocumentType;
import io.mersel.dss.signer.api.services.timestamp.TimestampConfigurationService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.xml.crypto.dsig.CanonicalizationMethod;
/**
* XAdES imza seviyelerini yükselten servis.
* e-Arşiv Raporları ve e-Bilet Raporları için XAdES-B'den XAdES-A'ya yükseltme yapar.
*/
@Service
public class XAdESLevelUpgradeService {
private static final Logger LOGGER = LoggerFactory.getLogger(XAdESLevelUpgradeService.class);
private final CertificateVerifier certificateVerifier;
private final TimestampConfigurationService timestampService;
public XAdESLevelUpgradeService(CertificateVerifier certificateVerifier,
TimestampConfigurationService timestampService) {
this.certificateVerifier = certificateVerifier;
this.timestampService = timestampService;
}
/**
* Belge tipine göre imza seviyesini yükseltir.
* e-Arşiv Raporları ve e-Bilet Raporları için XAdES-A yükseltmesi yapılır.
*
* @param signedDocument İmzalanmış belge
* @param documentType Belge tipi
* @param baseParameters Temel imza parametreleri
* @return Seviyesi yükseltilmiş belge (veya değişiklik yapılmamışsa orijinal)
*/
public DSSDocument upgradeIfNeeded(DSSDocument signedDocument,
DocumentType documentType,
XAdESSignatureParameters baseParameters) {
if (documentType != DocumentType.EArchiveReport && documentType != DocumentType.EBiletReport) {
return signedDocument;
}
if (!timestampService.isAvailable()) {
LOGGER.warn("Timestamp servisi yapılandırılmamış. {} için XAdES-A yükseltmesi atlanıyor.", documentType);
return signedDocument;
}
try {
LOGGER.info("{} için XAdES-A seviyesine yükseltiliyor...", documentType);
// Timestamp parametrelerini yapılandır
XAdESTimestampParameters tsParams = new XAdESTimestampParameters();
tsParams.setCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS);
tsParams.setDigestAlgorithm(DigestAlgorithm.SHA256);
baseParameters.setArchiveTimestampParameters(tsParams);
baseParameters.setSignatureTimestampParameters(tsParams);
baseParameters.setContentTimestampParameters(tsParams);
baseParameters.setEn319132(false);
// XAdES-A seviyesine yükselt
XAdESLevelA levelA = new XAdESLevelA(certificateVerifier);
levelA.setTspSource(timestampService.getTspSource());
DSSDocument upgradedDocument = levelA.extendSignatures(signedDocument, baseParameters);
LOGGER.info("{} başarıyla XAdES-A seviyesine yükseltildi", documentType);
return upgradedDocument;
} catch (Exception ex) {
LOGGER.error("XAdES seviye yükseltme başarısız. XAdES-B seviyesi korunuyor.", ex);
// Hata durumunda orijinal belgeyi döndür (XAdES-B)
return signedDocument;
}
}
}