ESYA'dan PrimeAPI'ye Geçiş: Adım Adım Teknik Migrasyon Rehberi
PrimeAPI

ESYA'dan PrimeAPI'ye Geçiş: Adım Adım Teknik Migrasyon Rehberi

ESYA MA3 API den PrimeAPI ye teknik geçiş rehberi. Mimari farklar, endpoint eşleştirmeleri, kod örnekleri ve geçiş kontrol listesi.

Nazmi E.

Nazmi E.

ONAYLARIM Destek Ekibi

ESYA'nın ücretsiz sürümünün kapanmasına 2 hafta kaldı. Önceki yazımızda ne olduğunu ve seçeneklerinizi anlattık. Bu yazıda ise nasıl geçiş yapacağınızı anlatıyoruz: ESYA MA3 API'den PrimeAPI'ye teknik migrasyon adımları, mimari farklar ve endpoint eşleştirmeleri.

Mimari Fark: Kütüphane vs REST API

ESYA ve PrimeAPI temelden farklı bir mimaride çalışır. Bu farkı anlamak, geçiş stratejinizi şekillendirecek en önemli nokta.

ESYA (MA3 API):

  • Yerel kütüphane. Java JAR veya .NET DLL olarak projenize eklenir.
  • Tüm imza işlemleri (hash oluşturma, imzalama, birleştirme) uygulamanızın process'inde çalışır.
  • Sertifika erişimi, PKCS#11 driver'ları, TSP sunucu iletişimi — hepsi sizin yönetiminizde.
  • Platform bağımlı: Java veya .NET zorunlu.

PrimeAPI:

  • REST API. HTTP istekleri atabilen her dil ve platformda çalışır.
  • Hash oluşturma ve imza birleştirme sunucu tarafında (Onaylarım PrimeAPI) gerçekleşir.
  • Yerel imzalama, kullanıcının bilgisayarındaki e-İmza Aracı üzerinden yapılır.
  • Sertifika yönetimi, zaman damgası, CRL/OCSP kontrolleri API tarafında halledilir.

Pratik sonuç: ESYA'da doğrudan yönettiğiniz birçok alt sistemi (TSP, CRL, sertifika deposu) PrimeAPI'de yönetmeniz gerekmez. Ancak mimari olarak bir backend proxy katmanı eklemeniz gerekir.

Geçiş Stratejisi: 3 Senaryo

Projenizin yapısına göre geçiş scope'u değişir:

Senaryo 1: ESYA Doğrudan Çağrılıyor

Uygulamanız ESYA sınıflarını doğrudan kullanıyorsa (EsyaSmartCardManager, BaseSignedData, PadesSigner vb.), tüm imza katmanını yeniden yazmanız gerekir. Bu en kapsamlı senaryo.

Geçiş adımı: ESYA çağrılarını bir servis arayüzü (interface) arkasına alın, ardından bu arayüzün PrimeAPI implementasyonunu yazın.

Senaryo 2: Abstraction Layer Var

Uygulamanızda zaten bir ISigningService veya benzeri bir soyutlama varsa, sadece yeni bir implementasyon yazmanız yeterli. Mevcut iş mantığınız değişmez.

Geçiş adımı: PrimeApiSigningService implementasyonunu yazın, DI container'da swap edin.

Senaryo 3: Web Uygulaması + Tarayıcı Tabanlı İmza

Eğer ESYA'yı tarayıcı eklentisi veya Java Applet üzerinden kullanıyorsanız, zaten eski bir mimaridesiniz. PrimeAPI'nin e-İmza Aracı + REST API yaklaşımı daha modern ve sürdürülebilir.

Geçiş adımı: Frontend'de e-İmza Aracı entegrasyonu, backend'de proxy endpoint'leri yazın. PrimeAPI Quickstart yazımız tam olarak bunu gösteriyor.

İmza İşlem Akışı Karşılaştırması

ESYA ile PAdES İmzalama (Java)

ESYA'da tipik bir PAdES imzalama akışı şu adımlardan oluşur:

  1. SmartCardManager ile akıllı karta bağlan
  2. Sertifikayı oku (ECertificate)
  3. PadesSigner nesnesi oluştur
  4. İmza parametrelerini ayarla (profil, hash algoritması, zaman damgası)
  5. sign() metodu ile imzala
  6. İmzalı dosyayı kaydet

Tüm bu işlemler tek bir process içinde, senkron olarak gerçekleşir.

PrimeAPI ile PAdES İmzalama

PrimeAPI'de aynı işlem 4 HTTP çağrısına dönüşür:

  1. Dosya yüklePOST /CoreApiFile/UploadFileoperationId al
  2. Hash oluşturPOST /V4/CoreApiPades/SignStepOnePadesCorestate, keyId, keySecret al
  3. Yerel imzalaPOST localhost:8099/signStepTwo (e-İmza Aracı) → signedData al
  4. BirleştirPOST /V4/CoreApiPades/SignStepThreePadesCore → imzalı dosya hazır

Adım 1-2 ve 4 backend proxy'niz üzerinden CoreAPI'ye gider. Adım 3, kullanıcının tarayıcısından doğrudan e-İmza Aracı'na gider.

Endpoint Eşleştirme Tablosu

ESYA'daki sınıf/metot kullanımlarınızı PrimeAPI endpoint'lerine şöyle eşleyebilirsiniz:

ESYA İşlemiPrimeAPI EndpointNot
PadesSigner.sign()StepOne → signStepTwo → StepThree3 adımlı akış
CadesSigner.sign()/V4/CoreApiCades/SignStepOneCadesCore + StepTwo + StepThreeAynı 3 adım
XadesSigner.sign()/V4/CoreApiXades/SignStepOneXadesCore + StepTwo + StepThreeAynı 3 adım
SignedDataValidation.verify()/CoreApiCades/Verify veya /CoreApiPades/VerifyFormat bazlı
CertificateValidation.validate()Sertifika bilgisi /reset ile e-İmza Aracı'ndan okunurDoğrulama API tarafında
TimeStampClientOtomatik — SignatureLevel BLTA seçildiğindeAyrı yönetim yok
SmartCardManagere-İmza Aracı (localhost:8099/reset)Kart erişimi aracı üzerinden
CertificateStore / CRL-OCSPOtomatik — API tarafında yönetilirAyrı yapılandırma yok

Parametre Eşleştirmeleri

İmza Profilleri

ESYAPrimeAPIAçıklama
SignaturePolicy.P1profile: 1Temel profil
SignaturePolicy.P2profile: 2Genişletilmiş profil
SignaturePolicy.P3profile: 3Arşiv profili
SignaturePolicy.P4profile: 4Tam profil

İmza Seviyeleri (PAdES)

ESYAPrimeAPIAçıklama
PAdES_B_BsignatureLevel: 1Temel imza
PAdES_B_TsignatureLevel: 2Zaman damgalı
PAdES_B_LTsignatureLevel: 3Uzun vadeli
PAdES_B_LTAsignatureLevel: 4Arşiv (önerilen)

Hash Algoritmaları

ESYAPrimeAPIAçıklama
DigestAlg.SHA256hashAlgorithm: 0Standart
DigestAlg.SHA384hashAlgorithm: 1Yüksek güvenlik
DigestAlg.SHA512hashAlgorithm: 2Maksimum güvenlik

Kod Örneği: Abstraction Layer ile Geçiş

Aşağıda, mevcut ESYA kodunuzu PrimeAPI'ye taşırken kullanabileceğiniz bir soyutlama yaklaşımı var. Bu pattern, iki sistemi paralel çalıştırmanıza da olanak tanır.

Interface Tanımı

public interface ISigningService
{
    Task<string> UploadFileAsync(Stream fileStream, string fileName);
    Task<CreateStateResult> CreateStateAsync(string operationId, string certificate, 
        SignatureFormat format, int profile, int level);
    Task<string> FinishSignAsync(string operationId, string signedData, 
        string keyId, string keySecret, SignatureFormat format);
}

public enum SignatureFormat { PAdES, CAdES, XAdES }

public class CreateStateResult
{
    public string State { get; set; }
    public string KeyId { get; set; }
    public string KeySecret { get; set; }
    public string OperationId { get; set; }
}

PrimeAPI Implementasyonu

public class PrimeApiSigningService : ISigningService
{
    private readonly string _baseUrl;
    private readonly string _apiKey;

    public PrimeApiSigningService(IOptions<OnaylarimApiOptions> options)
    {
        _baseUrl = options.Value.BaseUrl;
        _apiKey = options.Value.ApiKey;
    }

    public async Task<string> UploadFileAsync(Stream fileStream, string fileName)
    {
        var response = await $"{_baseUrl}/CoreApiFile/UploadFile"
            .WithHeader("X-API-KEY", _apiKey)
            .PostMultipartAsync(mp => mp.AddFile("file", fileStream, fileName))
            .ReceiveJson<OnaylarimApiResponse>();

        return response.OperationId;
    }

    public async Task<CreateStateResult> CreateStateAsync(
        string operationId, string certificate,
        SignatureFormat format, int profile, int level)
    {
        var endpoint = format switch
        {
            SignatureFormat.PAdES => "/V4/CoreApiPades/SignStepOnePadesCore",
            SignatureFormat.CAdES => "/V4/CoreApiCades/SignStepOneCadesCore",
            SignatureFormat.XAdES => "/V4/CoreApiXades/SignStepOneXadesCore",
            _ => throw new ArgumentException("Geçersiz format")
        };

        var response = await $"{_baseUrl}{endpoint}"
            .WithHeader("X-API-KEY", _apiKey)
            .PostJsonAsync(new
            {
                certificate,
                operationId,
                signatureLevel = level,
                profile,
                hashAlgorithm = 0 // SHA256
            })
            .ReceiveJson<OnaylarimApiResponse>();

        return new CreateStateResult
        {
            State = response.State,
            KeyId = response.KeyID,
            KeySecret = response.KeySecret,
            OperationId = response.OperationId
        };
    }

    public async Task<string> FinishSignAsync(
        string operationId, string signedData,
        string keyId, string keySecret, SignatureFormat format)
    {
        var endpoint = format switch
        {
            SignatureFormat.PAdES => "/V4/CoreApiPades/SignStepThreePadesCore",
            SignatureFormat.CAdES => "/V4/CoreApiCades/SignStepThreeCadesCore",
            SignatureFormat.XAdES => "/V4/CoreApiXades/SignStepThreeXadesCore",
            _ => throw new ArgumentException("Geçersiz format")
        };

        var response = await $"{_baseUrl}{endpoint}"
            .WithHeader("X-API-KEY", _apiKey)
            .PostJsonAsync(new { signedData, keyId, keySecret, operationId })
            .ReceiveJson<OnaylarimApiResponse>();

        return response.OperationId;
    }
}

DI Kaydı

// ESYA'dan PrimeAPI'ye geçiş — tek satır değişiklik
// builder.Services.AddScoped<ISigningService, EsyaSigningService>();
builder.Services.AddScoped<ISigningService, PrimeApiSigningService>();

Mevcut ESYA implementasyonunuzu silmeyin. Paralel çalışma döneminde her iki servisi de test edebilir, sorun çıkarsa geri dönebilirsiniz.

Mobil İmza Geçişi

ESYA'da mobil imza ayrı bir kütüphane ve farklı bir akış gerektiriyordu. PrimeAPI'de mobil imza aynı API yapısı içinde, format bazlı mobil imza endpoint'leri ile çalışır:

FormatMobil İmza Endpoint
PAdES/V4/CoreApiMobilePades/...
CAdES/V4/CoreApiMobileCades/...
XAdES/V4/CoreApiMobileXades/...

Akış, e-imza ile aynıdır — tek fark, StepTwo'da e-İmza Aracı yerine kullanıcının cep telefonuna SMS onay gitmesidir. Bu sayede akıllı kart veya token olmadan imza atılabilir.

Eliptik Eğri (EC) Uyumu

KamuSM'nin yeni NES sertifikaları RSA yerine Eliptik Eğri (EC) algoritmasını kullanıyor. ESYA'nın eski sürümlerinde EC desteği sorunlu olabiliyordu.

PrimeAPI V4, EC anahtarlı sertifikalarla sorunsuz çalışır. RSA'dan EC'ye geçişte uygulamanızda ek bir değişiklik gerekmez — API, sertifika türünü otomatik algılar ve uygun algoritmayı kullanır.

Geçiş Kontrol Listesi

Haziran'a kalan 2 haftada şu adımları takip edin:

Hafta 1 — Hazırlık ve Test:

  1. ESYA kullanım envanterinizi çıkarın: hangi formatlar, hangi profiller, hangi seviyeler.
  2. PrimeAPI sandbox API anahtarını alın (ücretsiz).
  3. Backend proxy'yi kurun. Quickstart yazımızdaki .NET örneğini temel alabilirsiniz.
  4. ISigningService abstraction layer'ını oluşturun, PrimeAPI implementasyonunu yazın.
  5. Test ortamında tüm imza senaryolarınızı çalıştırın.

Hafta 2 — Production Geçişi:

  1. Production API anahtarınızı alın.
  2. Backend proxy'yi production ortamına deploy edin.
  3. DI container'da ESYA → PrimeAPI swap'ını yapın.
  4. Paralel çalışma döneminde her iki sistemi de izleyin.
  5. 1 Haziran öncesi ESYA bağımlılığını tamamen kaldırın.

Yönetmeniz Gerekmeyen Şeyler

ESYA'dan PrimeAPI'ye geçişte işiniz azalan alanlar:

  • Zaman damgası sunucu yapılandırması — PrimeAPI, SignatureLevel BLTA seçildiğinde zaman damgasını otomatik ekler.
  • CRL/OCSP kontrolleri — Sertifika geçerlilik kontrolleri API tarafında yapılır.
  • PKCS#11 driver yönetimi — e-İmza Aracı, farklı kart okuyucu ve token'larla uyumluluğu kendi yönetir.
  • Kütüphane sürüm güncellemeleri — REST API olduğu için istemci tarafında güncelleme gerekmez.

PrimeAPI sandbox ortamını test etmek için PrimeAPI sayfasını ziyaret edin. Geçiş sürecinizde teknik destek için bizimle iletişime geçin.

Detaylı API dokümantasyonu: primeapidocs.onaylarim.com

İlgili Yazılar

Tüm yazıları gör