DamgaOndiso

İmzayı doğrulamak

Damga imzayı platformunuza teslim etmeden önce doğrular. Yine de imzayı kendi kaydınızla eşleştirmek sizin işinizdir ve arşivdeki bir belgeyi yıllar sonra Damga olmadan da doğrulayabilmelisiniz.

Damga'nın yaptığı denetimler

  • İmza (CAdES-BES, ayrık CMS) belgenin baytlarıyla tutarlı mı? (openssl cms -verify)
  • PAdES'te: imzalı PDF gönderdiğiniz PDF'in baytlarıyla aynen başlıyor mu (artımlı güncelleme; belge değiştirilmeden imza sona eklenmiş), son imzanın /ByteRange'i kendi /Contents değeri dışında dosyanın tamamını kapsıyor mu, imza bu aralıklarla doğrulanıyor mu?
  • XAdES'te (imzalı XML): XML'de tek ds:Signature var mı, başvuru özetleri (belgenin tamamı ve SignedProperties) ve imza değeri tutuyor mu, SigningCertificateV2 özeti KeyInfo'daki sertifikayla aynı mı, imza çıkarıldığında XML gönderdiğiniz belgeyle kanonik olarak aynı mı, imza profilin gerektirdiği yerde mi? UBL-TR'de cac:Signature'daki VKN / T.C. kimlik no imzalayanla aynı mı? Ayrıntı: e-Fatura ve e-Defter.
  • Zaman damgalı imzalarda (level T ve üstü): damga imza değerini (PAdES-B-LTA'da ayrıca belgenin tamamını) damgalamış mı, TSA imzası geçerli mi, damga bu istek için Damga sunucusundan mı alınmış? PAdES-B-LT'de imzadan sonra yalnız DSS ve belge zaman damgası eklenmiş mi?
  • İmzalayan sertifika imza anında geçerli mi?
  • İstekte signer.national_id verildiyse sertifikadaki T.C. kimlik numarası aynı mı? signer.tax_id verildiyse mühürdeki VKN aynı mı?
  • allowed_kinds verildiyse sertifikanın türü (NES, mali mühür, e-mühür) izinli mi? Tür, imzadaki sertifikadan sunucuda çıkarılır.
  • İmza, sayfada seçilen sertifikayla mı atılmış?
  • Canlı platformda test / geliştirme sertifikası kullanılmış mı? (reddedilir)
  • Damga sunucusuna Kamu SM / ESHS kökleri yüklüyse: sertifika zinciri güvenilir bir kökte bitiyor mu?

Sizin yapmanız gerekenler

  1. Kişiyi eşleştirin. signature.signer.national_id, imzayı isteyen kullanıcınızın T.C. kimlik numarasıyla aynı olmalı (mühürlerde signature.signer.tax_id kurumun VKN'si). İstekte signer.national_id / signer.tax_id verdiyseniz Damga bunu zaten denetler.
  2. Belgeyi eşleştirin. document.sha256, sizin gönderdiğiniz PDF'in SHA-256'sı olmalı. PAdES'te indirdiğiniz imzalı PDF'in SHA-256'sı signature.document.sha256 ile aynı olmalı.
  3. Birlikte saklayın. CAdES: PDF + .imz + imza anı + Damga istek kimliği. PAdES: imzalı PDF + Damga istek kimliği (imza ve sertifika PDF'in içindedir). XAdES: imzalı XML + Damga istek kimliği.

PAdES: imzalı PDF'i doğrulamak

İmzalı PDF'i Adobe Acrobat Reader'da açın: imza paneli imzalayanı ve "belge imzalandıktan sonra değiştirilmedi" bilgisini gösterir. Kamu SM / ESHS kök sertifikaları bilgisayarda güvenilir değilse Reader "imzacının kimliği bilinmiyor" diyebilir; bu, imzanın bozuk olduğu anlamına gelmez.

Kendi sunucunuzda (PHP, ek paket gerekmez) Damga'nın yaptığının aynısı:

$pdf = file_get_contents('sozlesme-imzali.pdf');
preg_match_all('/\/ByteRange\s*\[\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s*\]/', $pdf, $m, PREG_SET_ORDER);
[, $a, $b, $c, $d] = array_map('intval', end($m));          // son imza
if ($a !== 0 || $c + $d !== strlen($pdf)) { exit('imzadan sonra belgeye ekleme yapılmış'); }
$hex = trim(substr($pdf, $b, $c - $b), '<>');                // /Contents: CMS + sıfır dolgusu
file_put_contents('imza.der', hex2bin($hex));                // OpenSSL sondaki sıfır dolgusunu yok sayar
file_put_contents('kapsanan.bin', substr($pdf, 0, $b) . substr($pdf, $c, $d));
$ok = openssl_cms_verify('kapsanan.bin', OPENSSL_CMS_DETACHED | OPENSSL_CMS_BINARY | OPENSSL_CMS_NOVERIFY,
    'imzalayan.pem', [], null, null, null, 'imza.der', OPENSSL_ENCODING_DER);

Ya da Damga'ya sorun: POST /verify gövdesinde yalnız document (imzalı PDF) gönderin.

Kendi sunucunuzda doğrulama

PHP (OpenSSL eklentisi):

// ayrık imza: 1. parametre belge, 8. parametre imza dosyası
$flags = OPENSSL_CMS_DETACHED | OPENSSL_CMS_BINARY | OPENSSL_CMS_NOVERIFY; // zincir için NOVERIFY'ı kaldırıp CA dosyası verin
$ok = openssl_cms_verify('belge.pdf', $flags, 'imzalayan.pem', [], null, null, null, 'belge.imz', OPENSSL_ENCODING_DER);
$cert = openssl_x509_parse(file_get_contents('imzalayan.pem'));
$tc = preg_replace('/\D/', '', $cert['subject']['serialNumber'] ?? '');

Komut satırı:

openssl cms -verify -binary -inform DER -in belge.imz -content belge.pdf -noverify -out /dev/null
# zincirle birlikte:
openssl cms -verify -binary -inform DER -in belge.imz -content belge.pdf -CAfile kamusm-kokler.pem -out /dev/null

Java (BouncyCastle):

CMSSignedData cms = new CMSSignedData(new CMSProcessableByteArray(pdf), imz);
SignerInformation si = cms.getSignerInfos().getSigners().iterator().next();
X509CertificateHolder cert = (X509CertificateHolder) cms.getCertificates().getMatches(si.getSID()).iterator().next();
boolean ok = si.verify(new JcaSimpleSignerInfoVerifierBuilder().build(cert));

Ya da Damga'ya sorun: POST /verify.

İmzanın biçimi

CAdES (format: "cades", ayrık .imz):

Özellik Değer
Yapı CMS SignedData, ayrık (eContent yok)
Özet SHA-256
İmza algoritması RSA: SHA256withRSA (PKCS#1 v1.5) · EC: SHA256withECDSA
İmzalı öznitelikler contentType, messageDigest, signingTime, signingCertificateV2 (ESSCertIDv2)
Sertifikalar İmzalayan sertifika ve e-imza USB'sinde varsa zincir
Dosya DER, .imz uzantısı

Bu yapı CAdES-BES profilidir. Zaman damgası (CAdES-T) ve uzun dönem doğrulama verileri (CAdES-XL/A) şu an eklenmez; uzun süreli arşivde bunları kendi zaman damgası hizmetinizle ekleyebilirsiniz.

PAdES (format: "pades", imza PDF'in içinde):

Özellik Değer
Profil PAdES baseline B-B (ETSI EN 319 142-1)
İmza sözlüğü /Filter /Adobe.PPKLite, /SubFilter /ETSI.CAdES.detached, /M imza zamanı, varsa /Reason, /Location
Kapsam /ByteRange: dosyanın tamamı, /Contents hariç; imza artımlı güncellemeyle sona eklenir
CMS CAdES ile aynı, ancak imzalı özniteliklerde signingTime yoktur (PAdES'te yasak; zaman /M'de): contentType, messageDigest, signingCertificateV2
Görünüm İsteğe bağlı imza kutusu (gömülü IBM Plex Sans), ya da görünmez imza

Zaman damgası (PAdES-B-T) ve uzun dönem doğrulama verileri (PAdES-B-LT / LTA) şu an eklenmez.