====== 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 getInvalidValidationResults() { List invalids = new ArrayList(); // root imzalari tara for (Signature signature : results.keySet()) { // counter imzalari tara traceResults(results.get(signature), invalids); } return invalids; } private void traceResults(SignatureValidationResult svr, List 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 [[esya:eimza:profiller|İ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);