Bu sayfanın seçili sürümü ile mevcut sürümü arasındaki farkları gösterir.
esya:ortakimza:imza-api-kullanim [2013/07/15 11:26] Ahmet Yetgin created |
esya:ortakimza:imza-api-kullanim [2013/08/19 05:50] (mevcut) Dindar Öz |
||
---|---|---|---|
Satır 1: | Satır 1: | ||
====== Kütüphane Kullanımı ====== | ====== Kütüphane Kullanımı ====== | ||
- | ==== İmza Atma ==== | + | ===== İmza Atma ===== |
+ | |||
+ | ==== Basit (ES-BES) İmza Atma ==== | ||
<sxh java;highlight:[8,11] ;title:Java & .NET> | <sxh java;highlight:[8,11] ;title:Java & .NET> | ||
// imza konteyneri yarat | // imza konteyneri yarat | ||
Satır 38: | Satır 40: | ||
container.write(new FileOuputStream(fileName)); | container.write(new FileOuputStream(fileName)); | ||
</sxh> | </sxh> | ||
+ | |||
+ | ===== İmza Geliştirme ===== | ||
==== Basit (ES-BES) İmzayı Zaman Damgalı İmzaya Çevirme ==== | ==== Basit (ES-BES) İmzayı Zaman Damgalı İmzaya Çevirme ==== | ||
Satır 88: | Satır 92: | ||
olarak değiştimek yeterlidir. | olarak değiştimek yeterlidir. | ||
- | ==== İmza Doğrulama ==== | + | ===== İmza Doğrulama ===== |
İmza doğrulamada ''SignatureContainer'' içindeki ''verifyAll()'' metodu kullanılır. | İmza doğrulamada ''SignatureContainer'' içindeki ''verifyAll()'' metodu kullanılır. | ||
Satır 115: | Satır 119: | ||
Assert.AreEqual(ContainerValidationResultType.ALL_VALID, cvr.getResultType()); | Assert.AreEqual(ContainerValidationResultType.ALL_VALID, cvr.getResultType()); | ||
</sxh> | </sxh> | ||
+ | |||
+ | ==== İ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. | ||
+ | |||
+ | <sxh java; title: Java Code> | ||
+ | // 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); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </sxh> | ||
+ | |||
+ | <sxh csharp; title:.NET Code> | ||
+ | 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); | ||
+ | } | ||
+ | </sxh> | ||
+ | ===== Ç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. | ||
+ | |||
+ | <sxh java;title:Java Code;> | ||
+ | // 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)); | ||
+ | </sxh> | ||
+ | |||
+ | <sxh csharp; title:.NET Code;> | ||
+ | // 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)); | ||
+ | </sxh> | ||
+ | |||
+ | === 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. | ||
+ | |||
+ | <sxh java; title:Java & .NET Code;> | ||
+ | // 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)); | ||
+ | </sxh> | ||
+ | |||
+ | ==== İ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. | ||
+ | |||
+ | <sxh java;title:Java Code> | ||
+ | // 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); | ||
+ | </sxh> | ||
+ | |||
+ | ===== İ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. | ||
+ | |||
+ | <sxh java; title:Java & .NET Code;> | ||
+ | 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); | ||
+ | </sxh> | ||
+ | |||
+ | ==== P2 İmza Atma ==== | ||
+ | |||
+ | P2 profili zaman damgalı imzadır. | ||
+ | |||
+ | <sxh java; title:Java & .NET Code> | ||
+ | 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); | ||
+ | </sxh> | ||
+ | |||
+ | ==== P3 İmza Atma ==== | ||
+ | |||
+ | P3 profili doğrulama için SİL(Sertifika İptal Listesi) kullanılan uzun ömürlü imzalar içindir. | ||
+ | |||
+ | <sxh java;title:Java & .NET Code;> | ||
+ | // 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); | ||
+ | </sxh> | ||
+ | |||
+ | ==== P4 İmza Atma ==== | ||
+ | |||
+ | P4 profili doğrulama için ÇiSDuP(OCSP) kullanılan uzun ömürlü imzalar içindir. | ||
+ | |||
+ | <sxh java; title:Java & .NET Code> | ||
+ | // 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); | ||
+ | </sxh> | ||
+ | |||
+ |