İçeriğe geç

Bir imzayı doğru şekilde doğrulamak

Spec: RFC 5280, §6 Spec: RFC 6960 Spec: RFC 5652 Evidence: Test-backed

“İmza geçerlidir” ifadesi çoğu zaman tek bir şeyin denetlendiği anlamına gelir: matematik tutarlı mı? Oysa doğru doğrulama, birbirinden bağımsız en az beş noktayı denetler; bunlardan herhangi biri, yeşil onay işaretini anlamsız kılacak şekilde başarısız olabilir. Bu sayfa, denetimlerin tamamını ortaya koyar ve kısmi bir yanıtın neden tehlikeli olduğunu açıklar.

Bu konuda verilebilecek en tehlikeli çıktı, tek bir boolean değerdir. Bu, okuru “geçerli” ifadesini “güvenilir” olarak görmeye yöneltir; oysa “geçerli”, yalnızca baytların değiştirilmediği ve imzanın üç yıl önce süresi dolmuş, geçen ay iptal edilmiş, tanıdığınız hiçbir otoriteye zincirlenmeyen bir sertifikaya ait anahtarla atıldığı anlamına gelebilir. Bunların her biri ayrı bir denetimdir. Tek bir boolean değer bildiren bir yazılım, hangi denetimlerin önemli olduğuna sessizce karar vermiştir ve bu kararı sizin yerinize almıştır. Düzenlemeye tabi veya sözleşmeye dayalı bir ortamda, araç yalnızca en düşük maliyetli özelliği doğruladıysa “araç geçerli dedi” savunma sayılmaz.

Eksiksiz doğrulama, birbirinden ayrı beş soruyu yanıtlar. Bunlar bağımsızdır; birinden geçmek, diğerleri hakkında hiçbir şey söylemez:

  1. Bütünlük — imzalanan baytların karması hâlâ imzanın kapsadığı değerle eşleşiyor mu? (Bayt aralığı özetini yeniden hesaplayın; karşılaştırın.)
  2. Özgünlük — kriptografik imza, imzalama sertifikasındaki açık anahtarla, imzalanan öznitelikler üzerinden doğrulanıyor mu?
  3. Sertifika yolu — bu sertifika, her bağlantısı geçerli olacak şekilde, sizin seçtiğiniz bir güven çıpasına zincirleniyor mu?
  4. Zaman — sertifika, ilgili zamanda geçerlilik penceresinin içinde miydi ve o zaman, kendi kendine beyan edilmiş değil de güvenilen bir zaman mı?
  5. İptal — sertifika o anda, gerçekten elde edebileceğiniz veya gömülü kanıtlarla (OCSP/CRL) iptal edilmemiş miydi?

Beş denetimin tamamını gerçekleştirmemiş bir “geçerli”, eksiksiz bir yanıt gibi görünen eksik bir yanıttır.

NextPDF’in duruşu, her sorunun ayrı ele alınması ve her birinin açıkça yanıtlanması gerektiği yönündedir. Hiçbir soru tek bir iyimser bayrağa indirgenmez ve hiçbir denetim zahmetli olduğu için sessizce atlanmaz. Bu yaklaşım testlerle güvence altına alınır. Bu sayfanın standart destekli değil, test destekli olarak işaretlenmesinin nedeni budur: davranış yalnızca bir maddeden gerekçelendirilmez, test takımı tarafından korunur.

Bütünlük ve özgünlük uçtan uca test edilir. Bilinen bir sertifikayla gerçek bir imzalanan öznitelikler yapısı imzalanır ve test takımı imzayı, eşleşen açık anahtarla birden çok zaman vektörü üzerinde doğrular. Bu nedenle kurallı yapıyı bozan bir değişiklik testi de başarısız kılar. Sertifika yolu doğrulaması, kasıtlı olarak bir imza baytını değiştiren ve sonucun yapılandırılmış bir nedenle geçerli olmadığını doğrulayan testlerle güvence altında tutulur — atılan bir istisna değil, açıkça kaydedilen bir başarısızlık. Zaman damgası belirteci doğrulaması ayrı adımlara bölünür — çözümleme, imzalayan bilgisi, imzalanan öznitelikler, ileti özeti, sertifika bağlama, anahtar kullanımı, imza, üretim zamanı — ve her adım kendi başına test edilir; böylece “zaman damgası doğrulandı” ifadesi her adımın doğrulandığı anlamına gelir. İptal denetimindeki yumuşak başarısızlık (erişilemeyen bir yanıtlayıcı), hem kodda hem de testlerde, kesin “iptal edildi” durumundan ayırt edilir. İkisi asla aynı yanıt içinde birleştirilmez.

  1. Integrity Recompute the byte-range digest and compare it to the value the signature covers.
  2. Authenticity Verify the cryptographic signature against the certificate’s public key, over the signed attributes — not the raw content.
  3. Certificate path Build and validate the chain to a trust anchor you chose; every link’s signature, validity, and constraints must hold.
  4. Time Confirm the certificate was valid at the relevant instant, and that the instant is trusted time, not the signer’s clock.
  5. Revocation Confirm the certificate was not revoked at that time, using obtainable or embedded OCSP/CRL evidence.
Doğru bir PDF imza doğrulamasının sırayla yanıtladığı beş bağımsız soru. Her biri ayrıdır: birinden geçmek diğerleri hakkında hiçbir şey söylemez ve herhangi birinin atlanması genel sonucu eksik bırakır.

Evidence: Test-backed Davranış testlerle sabitlenir ve bu testler, standartların gerektirdiklerini uygulamaya taşır.

Bütünlük şuna dayanır: Spec: ISO 32000-2, §12.8.1 : özet, bayt aralığı üzerinden yeniden hesaplanır ve saklanan değerle karşılaştırılır; herhangi bir fark imzanın geçersiz olduğu anlamına gelir. Özgünlük denetimi, imzalanan öznitelikler üzerinden, gerçek bir imzalanan öznitelik kümesini imzalayan ve onu eşleşen açık anahtarla birkaç zaman vektörü üzerinde doğrulayan bir entegrasyon testiyle kapsanır. Sertifika yolu sorusu şudur: Spec: RFC 5280, §6.1 : geçerli yollar bir güven çıpasından başlar ve Spec: RFC 5280, §6.2 o algoritmanın bir yolun geçerli olması için asgari koşulları tanımladığını belirtir — yol doğrulayıcısına ait bir birim testi, değiştirilmiş bir imzanın açık bir nedenle valid = false ürettiğini, asla sessiz bir kabul üretmediğini doğrular.

İptal denetiminin sırası şuna dayanır: Spec: RFC 6960, §3.2 : bir istemci, imzalanmış bir iptal yanıtını geçerli olarak kabul etmeden önce, yanıtın kendi imzasının geçerli olduğunu ve imzalayanın o anda yetkili olduğunu doğrulamalıdır (SHALL) — ve Spec: RFC 6960, §4.2.2.2 bu yetkilendirmeyi, söz konusu CA tarafından doğrudan verilen bir id-kp-OCSPSigning yetki devri olarak tanımlar. Bu nedenle, yetkili ve doğrulanabilir bir imzalayana karşı doğrulanmamış bir iptal yanıtının anlamı yoktur. Sertifika bağlama denetimi şuna dayanır: Spec: RFC 5035, §5.4.2 : imzalanmış signing-certificate-v2 özniteliğindeki sertifika karması, imzayı doğrulamak için kullanılan sertifikayla eşleşmiyorsa, imza geçersiz sayılmalıdır (must). Bu, imzanın saldırganın seçtiği bir sertifikaya göre doğrulanmasıyla doğan yerine koyma açığını kapatır. Zaman damgası belirtecinin kendisi, Spec: RFC 5652 tarzında bir CMS nesnesi olarak, her adımı kendi başına test edilerek adım adım doğrulanır.

Asıl öğretici kısım bir API çağrısı değildir. Bir sonuca göre hareket etmeden önce yanıtlayabilmeniz gereken sorulardır. Bunu, bir incelemede sorumlu tutulacağınız denetim listesi gibi düşünün.

<?php
declare(strict_types=1);
// A correct validation produces a structured outcome, not one boolean.
// Before you trust a signature, you must be able to answer ALL of these:
//
// integrity : Does the byte-range digest still match? (tamper check)
// authenticity: Does the signature verify over the SIGNED ATTRIBUTES,
// not just the content?
// path : Does the certificate chain to a trust anchor YOU chose,
// with every link valid at the relevant time?
// time : Is the relevant time TRUSTED (a timestamp), or merely the
// signer's self-asserted clock?
// revocation : Was the certificate not revoked at that time, by evidence
// you obtained or that the document embedded?
//
// "valid: true" without an answer to every line above is an incomplete
// result. A path-validation outcome carries a `valid` flag AND a structured
// `reasons` list precisely so a failure says WHY — never a bare false.

Herhangi bir satırın yanıtı “bilmiyorum” ise, dürüst durum “geçerli” değil, “henüz belirlenmedi”dir — ve bu ikisini aynı saymak, bu sayfanın önlemek için var olduğu hatadır.

Tuzak, “kriptografik olarak geçerli” ifadesini “güvenilir” ile eşitlemektir. Bütünlük ve özgünlük birlikte yalnızca bu baytların bu anahtarın sahibi tarafından imzalandığını kanıtlar. Anahtarın sertifikasının güvenilir, güncel veya iptal edilmemiş olup olmadığı hakkında hiçbir şey söylemezler. Kendi oluşturduğunuz bir sertifikayla imzalanan bir belge “kriptografik olarak geçerli” olabilir ve hiçbir değer taşımayabilir. Diğer tuzak ise belirsiz bir iptal denetimini (yanıtlayıcı çevrimdışı) bir geçti ya da bir başarısız olarak görmektir. İkisi de değildir. Durum bilinmezdir ve doğru bir doğrulayıcı, iki yönden birine doğru tahmin yürütmek yerine bunu bilinmiyor olarak bildirir. Beş denetimden hangilerinin gerçekten çalıştırıldığını gizleyen yeşil bir onay işareti, bir doğrulama sonucu değildir. Bu, başka birinin sizin adınıza verdiği bir karardır.

NextPDF, yapısal ve kriptografik denetimleri gerçekleştirir ve test eder. Güven çıpalarınızı seçmez; bunların üzerine kurulan politikayı da garanti etmez. Hangi sertifikalara güveneceğiniz, motorun veremeyeceği bir dağıtım kararıdır. Güvenmemeniz gereken bir çıpaya doğru doğrulanan bir zincir, yine de güvenemeyeceğiniz bir sonuçtur. İptal kanıtı, yalnızca elde edilebiliyorsa veya gömülüyse denetlenebilir. Çevrimdışı bir yanıtlayıcı “belirsiz” sonucunu doğurur ve bunu bir hükme dönüştürmek motorun değil, politikanın seçimidir. Bu sayfa, hukuki yeterliliği değil, denetimleri açıklar. Doğrulanmış bir imzanın belirli bir hukuki etkisinin olup olmadığı; sertifikaya, imzalayana, yargı yetkisine ve yükümlülüğe bağlıdır. Gömülü kanıtın bu denetimleri zaman içinde nasıl yanıtlanabilir tuttuğu Uzun süreli doğrulama sayfasında ele alınır; bütünlük denetiminin arkasındaki bayt aralığı mekanizması ise İmzalar bir PDF içinde nasıl yer alır sayfasında bulunur.

Doğrulama yüzeyinin katmanlara göre kullanılabilirliği:

Signature validation checks — edition availability
Edition Availability
Core

İmzalanan öznitelikler üzerinden bütünlük ve özgünlük denetimleri; ayrıca tedarik edilen bir güven çıpasına karşı RFC 5280 §6 sertifika yolu doğrulaması.

Pro

RFC 3161 zaman damgası belirteci doğrulamasını ekler — güvenilir zaman sorusunu, bağımsız olarak denetlenen adımlara ayrıştırarak.

Enterprise

İptal değerlendirmesini (OCSP/CRL) ve gömülü uzun süreli malzemeye karşı doğrulamayı; belirsiz sonuçları kesin sonuçlardan ayırt ederek ekler.

  • Bütünlük denetimi — bayt aralığı özetini yeniden hesaplayıp imzanın kapsadığı değerle karşılaştırma.
  • Özgünlük denetimi — kriptografik imzayı, imzalama sertifikasının açık anahtarına karşı, imzalanan öznitelikler üzerinden doğrulama.
  • İmzalanan öznitelikler — imzanın gerçekte hesaplandığı, kimliği doğrulanmış CMS öznitelikleri (content-type, message-digest, signing-time, signing-certificate-v2).
  • Sertifika yolu doğrulaması — imzalama sertifikasından seçilen bir güven çıpasına kadar zinciri oluşturma ve denetleme (RFC 5280 §6).
  • Güven çıpası — güvenmeye karar verdiğiniz bir sertifika otoritesi; kabul edilebilir bir yolun kökü.
  • İptal denetimi — bir sertifikanın ilgili zamanda iptal edilip edilmediğini, OCSP veya bir CRL aracılığıyla belirleme.
  • Belirsiz — kanıt elde edilemediği için ne “iyi” ne de “iptal edildi” olan bir iptal sonucu; ne “geçti” ne de “başarısız”.