ESYAE-imza Kütüphaneleri

User Tools

Site Tools


esya:xades:kod-coklu-imza

XAdES Çoklu İmza Atma

Gerçek hayatta olduğu gibi, elektronik dökümanlarda da bir dökümanda birden fazla imzanın yer alması mümkündür. Bu bölümde yer alan örnekleri tr.gov.tubitak.uekae.esya.api.xades.example.multiple paketinin altında inceleyebilirsiniz.

esya.api.xmlsignature.SignedDocument.java sınıfı çoklu imzaları kolayca yönetmek için yazılmıştır. Bu sınıfı incelemenizde yarar var. Basitçe bu sınıfı kullandığımızda XML formatında bir imza oluşur. Bu format üzerinde görüldüğü gibi aynı döküman üzerinde birden fazla veri ve imza yer alabilir.

<?xml version="1.0" encoding="UTF-8" ?> 
<ma3:envelope xmlns:ma3="http://uekae.tubitak.gov.tr/xml/signature#" 
              xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
    <ma3:data> 
        <ma3:data-item>...</ma3:data-item>
        <ma3:data-item>...</ma3:data-item> 
        ... 
        <ma3:data> 
    <ma3:signatures> 
        <ds:signature>...</ds:signature> 
        <ds:signature>...</ds:signature> 
        ... 
    </ma3:signatures> 
</ma3:envelope>

Paralel İmza

Aynı döküman içindeki birbirinden bağımsız imzalardır. Aşağıdaki örnekte SignedDocument classını kullanarak önce imzalanacak veri dökümana eklenmekte, daha sonra bu veriyi imzalayan birbirinden bağımsız iki imza yaratılmaktadır. ParallelEnveloped sınıfını inceleyebilirsiniz.

Context context = createContext();

SignedDocument signatures = new SignedDocument(context);

Document doc = Resolver.resolve("./sample.txt", context);
String fragment = signatures.addDocument(doc);

XMLSignature signature1 = signatures.createSignature();

// add document as inner reference
signature1.addDocument("#"+fragment, "text/plain", false);

signature1.getSignedInfo().setSignatureMethod(SignatureMethod.RSA_SHA256);

// false-true gets non-qualified certificates while true-false gets qualified ones
X509Certificate cert = JSmartCardManager.getInstance().getSignatureCertificate(true, false);

// add certificate to show who signed the document
signature1.addKeyInfo(new ECertificate(cert.getEncoded()));

// now sign it by using smart card
signature1.sign(JSmartCardManager.getInstance().getSigner(PIN, cert));

XMLSignature signature2 = signatures.createSignature();

// add document as inner reference
signature2.addDocument("#"+fragment, "text/plain", false);

signature2.getSignedInfo().setSignatureMethod(SignatureMethod.RSA_SHA256);

// add certificate to show who signed the document
signature2.addKeyInfo(new ECertificate(cert.getEncoded()));

// now sign it by using smart card
signature2.sign(JSmartCardManager.getInstance().getSigner(PIN, cert));

// write combined document
signatures.write(new FileOutputStream(BASE_DIR + SIGNATURE_FILENAME));

Dışarıdaki veriyi imzalayan iki imzayı örnekleyelim. Örnek kodları ParallelDetached sınıfı içindedir.

Context context = createContext();

SignedDocument signatures = new SignedDocument(context);

XMLSignature signature1 = signatures.createSignature();

// add document as reference, but do not embed it
// into the signature (embed=false)
signature1.addDocument("./sample.txt", "text/plain", false);

signature1.getSignedInfo().setSignatureMethod(SignatureMethod.RSA_SHA256);

// false-true gets non-qualified certificates while true-false gets qualified ones
X509Certificate cert = JSmartCardManager.getInstance().getSignatureCertificate(true, false);

// add certificate to show who signed the document
signature1.addKeyInfo(new ECertificate(cert.getEncoded()));

// now sign it by using smart card
signature1.sign(JSmartCardManager.getInstance().getSigner(PIN, cert));

XMLSignature signature2 = signatures.createSignature();

// add document as reference, but do not embed it
// into the signature (embed=false)
signature2.addDocument("./sample.txt", "text/plain", false);

signature2.getSignedInfo().setSignatureMethod(SignatureMethod.RSA_SHA256);

// add certificate to show who signed the document
signature2.addKeyInfo(new ECertificate(cert.getEncoded()));

// now sign it by using smart card
signature2.sign(JSmartCardManager.getInstance().getSigner(PIN, cert));

// write combined document
signatures.write(new FileOutputStream(BASE_DIR + SIGNATURE_FILENAME));

Aradaki tek farkın imzalanacak veriyi, SignedDocument yerine sadece referans olarak XMLsigneture'a eklenmesi olduğunu fark ettiniz mi?

Seri İmza

Veriyi imzalayan imzanın imzalanmasıdır. Buna “counter signature” denir. Aşağıdaki örnekte önceden yaratılmış imzanın okunup, seri imzalanması gösterilmektedir. Örnek kodlar CounterDetached sınıfındadır.

Context context = createContext();

// read previously created signature, you need to run Detached.java first
Document doc = Resolver.resolve(Detached.SIGNATURE_FILENAME, context);
XMLSignature signature = XMLSignature.parse(doc, context);

// create counter signature
XMLSignature counterSignature = signature.createCounterSignature();

counterSignature.getSignedInfo().setSignatureMethod(SignatureMethod.RSA_SHA256);

// false-true gets non-qualified certificates while true-false gets qualified ones
X509Certificate cert = JSmartCardManager.getInstance().getSignatureCertificate(true, false);

// add certificate to show who signed the document
counterSignature.addKeyInfo(new ECertificate(cert.getEncoded()));

// now sign it by using smart card
counterSignature.sign(JSmartCardManager.getInstance().getSigner(PIN, cert));

// signature contains itself and counter signature
signature.write(new FileOutputStream(BASE_DIR + SIGNATURE_FILENAME));

Şimdi daha karışık bir senaryoda iki paralel imzanın olduğu bir dökümana bir de seri imza ekleyelim. Kodları CounterParallel sınıfından inceleyebilirsiniz.

Context context = createContext();

// read previously created signature
Document signatureFile = Resolver.resolve(ParallelDetached.SIGNATURE_FILENAME, context);
SignedDocument signedDocument = new SignedDocument(signatureFile, context);

// get first signature
XMLSignature signature = signedDocument.getSignature(0);

// create counter signature to the first one
XMLSignature counterSignature = signature.createCounterSignature();

counterSignature.getSignedInfo().setSignatureMethod(SignatureMethod.RSA_SHA256);

// false-true gets non-qualified certificates while true-false gets qualified ones
X509Certificate cert = JSmartCardManager.getInstance().getSignatureCertificate(true, false);

// add certificate to show who signed the document
counterSignature.addKeyInfo(new ECertificate(cert.getEncoded()));

// now sign it by using smart card
counterSignature.sign(JSmartCardManager.getInstance().getSigner(PIN, cert));

// signed doc contains both previous signature and now a counter signature
// in first signature
signedDocument.write(new FileOutputStream(BASE_DIR + SIGNATURE_FILENAME));

Bir önceki örnekten pek de farklı değil. Paralel imzaların SignedDocument içinde tutulması dışında.

esya/xades/kod-coklu-imza.txt · Son değiştirilme: 2013/08/05 11:29 Değiştiren: Süleyman Uslu