Bu, dökümanın eski bir sürümüdür!
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 docs/samples
altında xmlsig.samples.MultipleSignatures
class'ı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>
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.
Context context = new Context(BASE_DIR); 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); // add certificate to show who signed the document signature1.addKeyInfo(CERTIFICATE); // now sign it by using private key signature1.sign(PRIVATE_KEY); XMLSignature signature2 = signatures.createSignature(); // add document as inner reference signature2.addDocument("#"+fragment, "text/plain", false); // add certificate to show who signed the document signature2.addKeyInfo(CERTIFICATE); // now sign it by using private key signature2.sign(PRIVATE_KEY); // write combined document signatures.write(new FileOutputStream(FILENAME_PARALLEL_ENVELOPED));
Dışarıdaki veriyi imzalayan iki imzayı örnekleyelim.
Context context = new Context(BASE_DIR); 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); // add certificate to show who signed the document signature1.addKeyInfo(CERTIFICATE); // now sign it by using private key signature1.sign(PRIVATE_KEY); 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); // add certificate to show who signed the document signature2.addKeyInfo(CERTIFICATE); // now sign it by using private key signature2.sign(PRIVATE_KEY); // write combined document signatures.write(new FileOutputStream(FILENAME_PARALLEL_DETACHED));
Aradaki tek farkın imzalanacak veriyi, SignedDocument yerine sadece referans olarak XMLsigneture'a eklenmesi olduğunu fark ettiniz mi?
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:
// 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(); // sign counterSignature.addKeyInfo(CERTIFICATE); counterSignature.sign(PRIVATE_KEY); // signature contains itself and counter signature signature.write(new FileOutputStream(FILENAME_COUNTER_EXISTING));
Şimdi daha karışık bir senaryoda iki paralel imzanın olduğu bir dökümana bir de seri imza ekleyelim:
Context context = new Context(BASE_DIR); // read previously created signature Document signatureFile = Resolver.resolve(FILENAME_PARALLEL_DETACHED, context); SignedDocument signedDocument = new SignedDocument(signatureFile, context); // get First signature XMLSignature signature = signedDocument.getSignature(0); // create counter signature XMLSignature counterSignature = signature.createCounterSignature(); // sign counterSignature.addKeyInfo(CERTIFICATE); counterSignature.sign(PRIVATE_KEY); // signed doc contains both previous signature and now a counter signature // in first signature signedDocument.write(new FileOutputStream(FILENAME_PARALLEL_COUNTER));
Bir önceki örnekten pek de farklı değil. Paralel imzaların SignedDocument içinde tutulması dışında.