ESYAE-imza Kütüphaneleri

User Tools

Site Tools


esya:ortakimza:imza-api-kullanim

Kütüphane Kullanımı

İmza Atma

Basit (ES-BES) İmza Atma

// imza konteyneri yarat
SignatureContainer container = 	SignatureFactory.createContainer(SignatureFormat.CAdES, context);

// konteyner içinde imza nesnesi oluştur
Signature signature = container.createSignature(certificate);

// imzalanacak içerik ekle
signature.addContent(new SignableFile(file), false);

// imzala
signature.sign(cardSigner);

// imzayı yaz
container.write(new FileOuputStream(fileName));

Zaman damgalı(ES-T) İmza Atma

// konteyner içinde imza nesnesi oluştur
Signature signature = container.createSignature(certificate);

// imzalanacak içerik ekle
signature.addContent(new SignableFile(file), false);

// imzala
signature.sign(cardSigner);

// imzayı zaman damgalı imza tipine geliştir
signature.upgrade(SignatureType.ES_T);

// imzayı dosyaya yaz
container.write(new FileOuputStream(fileName));

İmza Geliştirme

Basit (ES-BES) İmzayı Zaman Damgalı İmzaya Çevirme

// imza konteynerinidosyadan oku
SignatureContainer container = SignatureFactory.readContainer(fileInputStream);

// ilk imzayı al
Signature signature = container.getSignatures().get(0);

// imzayı zaman damgalı imza tipine geliştir
signature.upgrade(SignatureType.ES_T);

// imzayı dosyaya yaz
container.write(new FileOuputStream(fileName));

// imza konteynerinidosyadan oku
SignatureContainer container = SignatureFactory.readContainer(fileInputStream);

// ilk imzayı al
Signature signature = container.getSignatures()[0];

// imzayı zaman damgalı imza tipine geliştir
signature.upgrade(SignatureType.ES_T);

// imzayı dosyaya yaz
container.write(new FileOuputStream(fileName));

Gelişmiş (ES-XL) imza

Doğrulama bilgisini de içinde bulunduran imza tipi olan ES_XL tipinde imza oluşturmak için zaman damgalı imza atma örneklerindeki

// imza oluştur
...
// ve geliştir
signature.upgrade(SignatureType.ES_T);

satırını

// geliştir
signature.upgrade(SignatureType.ES_XL);

olarak değiştimek yeterlidir.

İmza Doğrulama

İmza doğrulamada SignatureContainer içindeki verifyAll() metodu kullanılır.

// imzayı oku
SignatureContainer container = SignatureFactory.readContainer(inputstream);
inputstream.close();

// imza doğrula
ContainerValidationResult cvr = container.verifyAll();

// imza yapısı içerisindeki bütün imzalar geçerli mi?
assertEquals(ContainerValidationResultType.ALL_VALID, cvr.getResultType());

// imzayı oku
SignatureContainer container = SignatureFactory.readContainer(inputstream);
inputstream.Close();

// imza doğrula
ContainerValidationResult cvr = container.verifyAll();

// imza yapısı içerisindeki bütün imzalar geçerli mi?
Assert.AreEqual(ContainerValidationResultType.ALL_VALID, cvr.getResultType());

İmza doğrulama Sonuç Nesnesi

İmza doğrulama sonuç nesnesi toString() metodu, imza nesne hiyerarşisini bir ağaç yapısında formatlı olarak döner.

SignatureContainer nesnesine ait doğrulama sonucu ContainerValidationResult, her bir imzaya ait doğrulama sonucu SignatureValidationResult nesnesidir. SignatureValidationResult nesneleri ContainerValidationResult içerisinde yer alır.

İmza doğrulama sonucunu anlamak için ContainerValidationResult içindeki ContainerValidationResultType alanına bakmak yeterlidir.

Hangi imzanın hatalı olduğu bilinmek istenirse ilgili imza sonuçları kontrolden geçirilmelidir.

// NOT bu metod ContainerValidationResult içinde 
// halihazırda mevcuttur !!!
public List<SignatureValidationResult> getInvalidValidationResults()
{
    List<SignatureValidationResult> invalids = 
                                 new ArrayList<SignatureValidationResult>();
    // root imzalari tara
    for (Signature signature : results.keySet()) {
        // counter imzalari tara
        traceResults(results.get(signature), invalids);
    }
    return invalids;
}

private void traceResults(SignatureValidationResult svr, 
                          List<SignatureValidationResult> invalids)
{
    // imza geçerli mi?
    if (svr.getResultType() != ValidationResultType.VALID) {
        invalids.add(svr);
    }
    // counter signatures
    if (svr.getCounterSignatureValidationResults() != null) {
        for (SignatureValidationResult counter :   
                                 svr.getCounterSignatureValidationResults())
        {
            traceResults(counter, invalids);
        }
    }
}

ContainerValidationResult cvr = container.verifyAll();

// konteyner içindeki tüm imza doğrulama sonuçlarını tara
for (Signature signature : cvr.getAllResults().Keys){
    // imza doğrulama sonucu
    SignatureValidationResult svr = cvr.getAllResults().get(signature);

    // imza geçerli mi?
    if (svr.getResultType != ValidationResultType.VALID)
        Console.WriteLine("Geçersiz imza "+svr);
}

Çoklu imza

İmza Ekleme

Seri imza

Bir imzayı imzalayan imzaya seri imza denir. Örneğin çalışan izin talebini imzalar. Yönetici de onay imzası atar. Seri imza oluşturmak için Signature nesnesi createCounterSignature(Certificate) metodu kullanılır.

// imza konteynerini dosyadan oku
SignatureContainer sc = SignatureFactory.readContainer(fileInputStream);

// konteynerdeki ilk imzayı al
Signature s = sc.getSignatures().get(0);

// seri imzayı oluştur
Signature counter= s.createCounterSignature(counterSignersCertificate);

// seri imza at
counter.sign(cardSigner);

// imza konteynerini dosyaya yaz
sc.write(new FileOuputStream(fileName));

// imza konteynerini dosyadan oku
SignatureContainer sc = SignatureFactory.readContainer(fileInputStream);

// konteynerdeki ilk imzayı al
Signature s = sc.getSignatures()[0];

// seri imzayı oluştur
Signature counter= s.createCounterSignature(counterSignersCertificate);

// seri imza at
counter.sign(cardSigner);

// imza konteynerini dosyaya yaz
sc.write(new FileOuputStream(fileName));

Paralel imza

SignatureContainer içinde createSignature() metodu her çağrıldığında bir imza yaratılmış ve imza konteynere eklenmiş olur. SignatureContainer içindeki birbirinden bağımsız(birbirini imzalamayan) bu imzalara paralel imza denir.

// imza konteynerini dosyadan oku
SignatureContainer container =    
        SignatureFactory.readContainer(fileInputStream);

Signature s1 = container.createSignature(certificate1);
s.addContent(new SignableFile(file), true);
s.sign(signer1);

Signature s2 = container.createSignature(certificate2);
s2.addContent(new SignableFile(file), true);
s2.sign(signer2);

// imzayı dosyaya yaz
container.write(new FileOuputStream(fileName));

İmza Çıkarma

İmzayı üst yapısından ayırmak için detachFromParent() metodu kullanılır. Bu metodun uygulandığı imza, eğer bir seri imza ise üst imzadan, ilk seviyede bir imza ise konteynerden(SignatureContainer) ayrılmış olur. Ayrılan imzanın kendi seri imzaları varsa onlarda imza ile birlikte konteynerden çıkar.

// konteynerdeki ilk imzayı al
Signature s = sc.getSignatures().get(0);

// ilk seri imzayı oluştur
Signature counterSignature = s.getCounterSignatures().get(0);

// seri imzayı(ve alt imzalarını) çıkar
counterSignature.detachFromParent();

// imzayı yaz
container.write(stream);
.NET Code
// konteynerdeki ilk imzayı al
Signature s = sc.getSignatures()[0];

// ilk seri imzayı oluştur
Signature counterSignature = s.getCounterSignatures()[0];

// seri imzayı(ve alt imzalarını) çıkar
counterSignature.detachFromParent();

// imzayı yaz
container.write(stream);

İmza Profillerine Uygun İmza Atma

İmza profilleri hakkında detaylı açıklama için bu dökümanın İmza Profilleri bölümüne bakınız.

Türkiyede tanımlı imza profil politikaları TurkishESigProfiles sınıfında tanımlıdır.

P1 İmza Atma

P1 profili, temel olarak içinde imza zamanı özelliği olan ES-BES imzadır.

SignatureContainer container = SignatureFactory.createContainer(format);
Signature signature = container.createSignature(signersCertificate);
signature.addContent(contentToSign, true);
signature.setSigningTime(Calendar.getInstance());
signature.sign(cardSigner);
// imzayı yaz
container.write(stream);

P2 İmza Atma

P2 profili zaman damgalı imzadır.

SignatureContainer container = SignatureFactory.createContainer(format);
Signature signature = container.createSignature(signersCertificate);
signature.addContent(contentToSign, true);
// imza zamanı
signature.setSigningTime(Calendar.getInstance());
// imza politikası
signature.setSignaturePolicy(TurkishESigProfiles.SIG_POLICY_ID_P2v1);
// imzala
signature.sign(cardSigner);	
// ES-T tipi imzaya dönüştür (zaman damgası ekle)
signature.upgrade(SignatureType.ES_T);
// imzayı yaz
container.write(stream);

P3 İmza Atma

P3 profili doğrulama için SİL(Sertifika İptal Listesi) kullanılan uzun ömürlü imzalar içindir.

// context yarat
Context context = new Context(new File(workingDir).toURI());

// uygun setifika doğrulama politikası (doğrulamada sadece Sİl kullan)
context.getConfig().setCertificateValidationPolicy(crlOnlyPolicy);

// imzayı yarat
SignatureContainer c = SignatureFactory.createContainer(format, context);
Signature signature = c.createSignature(signersCertificate);

// imzalanacak içerik
signature.addContent(contentToSign, true);
// imza zamanı
signature.setSigningTime(Calendar.getInstance());

// imza politikası
signature.setSignaturePolicy(TurkishESigProfiles.SIG_POLICY_ID_P3v1);

// imzala
signature.sign(cardSigner);	
// gelişmiş(ES-XLong) imzaya çevir
signature.upgrade(SignatureType.ES_XL);
// imzayı yaz
c.write(stream);

P4 İmza Atma

P4 profili doğrulama için ÇiSDuP(OCSP) kullanılan uzun ömürlü imzalar içindir.

// context yarat
Context context = new Context(new File(workingDir).toURI());

// uygun sertifika doğrulama politikası (mümkün olan her zaman OCSP kullan)
context.getConfig().setCertificateValidationPolicy(ocspFirstPolicy);

// imzayı yarat
SignatureContainer c = SignatureFactory.createContainer(format, context);
Signature signature = c.createSignature(signersCertificate);

// imzalanacak içerik
signature.addContent(contentToSign, true);
// imza zamanı
signature.setSigningTime(Calendar.getInstance());

// imza politikası
signature.setSignaturePolicy(TurkishESigProfiles.SIG_POLICY_ID_P4v1);

// imzala
signature.sign(cardSigner);	
// gelişmiş(ES-XLong) imzaya çevir 
signature.upgrade(SignatureType.ES_XL);
// imzayı yaz
c.write(stream);

esya/ortakimza/imza-api-kullanim.txt · Son değiştirilme: 2013/08/19 05:50 Değiştiren: Dindar Öz