CertificateChainBuilderService.java

package io.mersel.dss.signer.api.services.certificate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/**
 * Birden fazla sağlayıcı kullanarak sertifika zinciri oluşturmayı orkestre eder.
 * Başarılı olana kadar sağlayıcıları öncelik sırasına göre dener.
 */
@Service
public class CertificateChainBuilderService {

    private static final Logger LOGGER = LoggerFactory.getLogger(CertificateChainBuilderService.class);

    private final List<CertificateChainProvider> providers;

    public CertificateChainBuilderService(List<CertificateChainProvider> providers) {
        // Önceliğe göre sırala (düşük = yüksek öncelik)
        this.providers = new ArrayList<>(providers);
        this.providers.sort(Comparator.comparingInt(CertificateChainProvider::getPriority));
    }

    /**
     * Mevcut sağlayıcıları kullanarak sertifika zinciri oluşturur.
     * Biri başarılı olana kadar her sağlayıcıyı öncelik sırasına göre dener.
     * 
     * @param leafCertificate Zincir oluşturulacak yaprak sertifika
     * @return Eksiksiz sertifika zinciri (yaprak dahil)
     */
    public List<X509Certificate> buildCertificateChain(X509Certificate leafCertificate) {
        LOGGER.debug("Sertifika zinciri oluşturuluyor: {}", 
            leafCertificate.getSubjectX500Principal());

        for (CertificateChainProvider provider : providers) {
            try {
                List<X509Certificate> chain = provider.buildChain(leafCertificate);
                if (chain != null && !chain.isEmpty()) {
                    LOGGER.info("Zincir başarıyla oluşturuldu. Sağlayıcı: {}", 
                        provider.getClass().getSimpleName());
                    return chain;
                }
            } catch (Exception e) {
                LOGGER.debug("Sağlayıcı {} zincir oluşturamadı: {}", 
                    provider.getClass().getSimpleName(), e.getMessage());
            }
        }

        // Yedek: Tek sertifika döndür
        LOGGER.warn("Tüm sertifika zinciri sağlayıcıları başarısız, tek sertifika kullanılıyor");
        List<X509Certificate> fallbackChain = new ArrayList<>();
        fallbackChain.add(leafCertificate);
        return fallbackChain;
    }
}