İ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/Contentsdeğ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:Signaturevar mı, başvuru özetleri (belgenin tamamı veSignedProperties) ve imza değeri tutuyor mu,SigningCertificateV2özetiKeyInfo'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'decac:Signature'daki VKN / T.C. kimlik no imzalayanla aynı mı? Ayrıntı: e-Fatura ve e-Defter. - Zaman damgalı imzalarda (
levelT 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_idverildiyse sertifikadaki T.C. kimlik numarası aynı mı?signer.tax_idverildiyse mühürdeki VKN aynı mı? allowed_kindsverildiyse 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
- 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ürlerdesignature.signer.tax_idkurumun VKN'si). İstektesigner.national_id/signer.tax_idverdiyseniz Damga bunu zaten denetler. - 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.sha256ile aynı olmalı. - 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.