ESYAE-imza Kütüphaneleri

User Tools

Site Tools


esya:cades:imza-dogrulama

Bu, dökümanın eski bir sürümüdür!


İmza Doğrulama İşlemleri

İmza doğrulama işlemi birçok kontrolcünün bir araya gelmesiyle yapılmaktadır. Bu kontrolcüler imzanın yapısal kontrollerinden ve sertifika kontrollerinden ulaşmaktadır. Sertifika kontrolleri sertifikanın yapısal kontrollerinden, sertifikanın güvenilir bir kökten verilmiş olmasından ve sertifika iptal kontrolünden oluşmaktadır. Sertifika iptal kontrolü dışında kalan kontroller matematiksel işlemlerden oluşmaktadır, ekstra bir bilgiye ihtiyaç duymamaktadır. Sertifika iptal kontrolü için ise sertifikayı verenin yayınlandığı uygun zamanlı SİL veya ÇİSDUP bilgisine ihtiyaç duyulmaktadır. Sertifika doğrulama işlemi için sertifika doğrulama işleminin konfigurasyonunu barındıran xml formatında politika dosyasına ihtiyaç vardır. Bu xml dosyasıdışında birçok parametre kullanılabilir. Bu parametrelere Parametreler bölümünden veya EParameters sınıfından bakabilirsiniz.

Bir imzalanmış verinin doğrulama işleminden SignedDataValidation sınıfı sorumludur. SignedDataValidation sınıfının verify(…) methodu kullanılarak imza doğrulama işlemi gerçeklenir. verify(…) fonksiyonu imzalanmış verinin byte [] halini ve imzalanmış verinin hangi parametrelere göre doğrulanacağı bilgisini alır. SignedDataValidation sınıfındaki verify(…) fonksiyonu ile imzalanmış döküman bir bütün halinde doğrulanır. İçindeki imzalardan biri doğrulanamamışsa verify(…), başarısız değer döner. İmza doğrulama yapan örnek kod bloğu;

byte[] signedData = AsnIO.dosyadanOKU(SIGNATURE_FILE);
ValidationPolicy policy=  PolicyReader.readValidationPolicy(new FileInputStream(POLICY_FILE));
		
Hashtable<String, Object> params = new Hashtable<String, Object>();
params.put(EParameters.P_CERT_VALIDATION_POLICY, policy);
		
SignedDataValidation sdv = new SignedDataValidation();
		
SignedDataValidationResult sdvr = sdv.verify(signedData, params);

if(sdvr.getSDStatus() != SignedData_Status.ALL_VALID)
	System.out.println("İmzaların hepsi doğrulamadı");		

System.out.println(sdvr.toString());
byte[] signedData = AsnIO.dosyadanOKU(SIGNATURE_FILE);
ValidationPolicy policy = PolicyReader.readValidationPolicy(new FileStream(POLICY_FILE,
FileMode.Open,
FileAccess.Read));


Dictionary<String, Object> params_ = new Dictionary<String, Object>();
params_[EParameters.P_CERT_VALIDATION_POLICY] = policy;

SignedDataValidation sdv = new SignedDataValidation();

SignedDataValidationResult sdvr = sdv.verify(signedData, params_);

if (sdvr.getSDStatus() != SignedData_Status.ALL_VALID)
Console.WriteLine("İmzaların hepsi doğrulamadı");

Console.WriteLine(sdvr.ToString());

Eğer imzalanan içerik imza içersinde ise içerik, BaseSignedData sınıfının getContent() fonksiyonu ile alınabilir.

İmza Doğrulama Sonucu

SignedDataValidation sınıfının verify(…)fonksiyonu doğrulama sonucu olarak SignatureValidationResult tipinde bir nesne döner. getSDStatus() fonksiyonu eğer bütün imzalar doğrulanmış ise ALL_VALID, eğer imzalardan en az bir tanesi doğrulanamamışsa NOT_ALL_VALID döner.SignedDataValidation nesnesinin toString() methodu bütün imzaların kontrol sonucu açıklamalarını döner. Eğer özellikle bir imzanın sonucu elde edilmek isteniyorsa imza ağacında gezerek elde edilebilir. Bu ağaç yapısı, BaseSignedData yapısındaki imzaların veri yapısı ile aynıdır. Örneğin birinci paralel imzanın, birinci seri imzasına ve bu imzanın doğrulama sonucuna aşağıdaki örnek kod ile ulaşılabilir.

BaseSignedData bs = getBaseSignedData();
SignedDataValidationResult sdvr = getValidationResult();
SignerfirstCounterSigner = bs.getSignerList().get(0).getCounterSigners().get(0);
SignatureValidationResultfirstCounterSignerVR = sdvr.
                                                   getSDValidationResults().get(0).
                                                   getCounterSigValidationResults().
                                                   get(0);

BaseSignedData bs = getBaseSignedData();
SignedDataValidationResult sdvr = getValidationResult();
Signer firstCounterSigner = bs.getSignerList()[0].getCounterSigners()[0];
SignatureValidationResult firstCounterSignerVR = sdvr.getSDValidationResults()[0].
                                                     getCounterSigValidationResults()[0];

Herbir imzanın doğrulama sonucu SignatureValidationResult nesnelerinde tutulur. Bir imzacının doğrulama sonucundan seri imzacılarının doğrulama sonuçlarına da erişilebilir. SignatureValidationResult nesnelerinin toString() fonksiyonu imzacının ve seri imzacıların doğrulama kontrolcülerinin sonuçlarını döner. Eğer sadece o imzaya ait kontrolcülerin açıklamaları elde edilmek isteniyorsa getValidationDetails() fonksiyonunu kullanınız. İmza tipi geliştikçe kontrol edilmesi gereken yapı ve sertifika artmaktadır. Zaman damgaları imza yapısına bir imza olarak eklendiklerinden ayrıca bir imza olarak kontrol edilmektedirler. SignatureValidationResult nesnesinden bir imzanın doğrulama sonucu getSignatureStatus() fonksiyonu ile Signature_Status yapısında alınabilir. Eğer imza sonucu INCOMPLETE ise sertifika doğrulama verisine ulaşılamamıştır.

Ön Doğrulama

Bir imzanın doğrulanması için imza atıldıktan sonra sertifika iptal bilgilerinin güncellenebilmesi için belirli bir süre geçmesi gerekmektedir. Bu süreye “kesinleşme süresi”(grace period) denilmektedir. API'de bu süre P_GRACE_PERIOD parametresi ile ayarlanabilir; varsayılan değeri 86400 saniye yani 24 saattir.

Bir imza doğrulanmaya çalışıldığında kesinleşme süresi geçmese bile imza ve sertifika doğrulanabilmektedir. Öndoğrulama denilen bu doğrulama bir kesinlik içermemektedir. Kesin bir doğrulama yapılabilmesi için kesinleşme süresinin geçmesi gerekmektedir. Bir imzanın doğrulanmasının ön doğrulama olduğunu aşağıdaki örnek kod ile öğrenebilirsiniz. Ön doğrulama için olgulaşmamış anlamına gelen “PREMATURE” kelimesi, kesinleşmiş imza için olgunlaşmış anlamına gelen “MATURE” kelimesi kullanılmaktadır. SignatureValidationResultnesnesinin getValidationState()fonksiyonu ile ön doğrulama yapılıp yapılmadığı bilgisi alınabilir.

SignedDataValidationResultsdvr = getValidationResult();
		
if(sdvr.getSDValidationResults().
        get(0).getValidationState() == 	ValidationState.PREMATURE)
	System.out.println("Ön doğrulama yapıldı.");
SignedDataValidationResult sdvr = getValidationResult();
if (sdvr.getSDValidationResults()[0].getValidationState() == ValidationState.PREMATURE)
Console.WriteLine("Ön doğrulama yapıldı");

Ön doğrulama ile kesin doğrulama arasında doğabilecek fark; ön doğrulama sırasında geçerli olan bir sertifikanın, kesin doğrulamada iptal edilmiş olmasıdır. Kullanıcı akıllı kartını çaldırdığında bu senaryo ile karşılaşılabilir. ÇiSDuP için kesinleşme süresi kısa olabilmektedir. Yalnız iptal bilgileri için SİLkullanılıyorsa bu süre uzayabilmekte. “E-İmza Profilleri” dökümanı ÇiSDuP kullanıldığında kesinleşme süresinin çok kısa olduğundan yok sayılabileceğini öngörüyor.ÇiSDuPkullanarak sertifika doğrulama yapıldığında, kesinleşme süresi kadar beklenmediğinden büyük avantaj sağlanmaktadır.

esya/cades/imza-dogrulama.1374491169.txt.gz · Son değiştirilme: 2013/07/22 11:06 Değiştiren: Beytullah Yiğit