Skip to content

Tanda Tangan Digital (HasSecurity)

Trait HasSecurity menyediakan setSignature() untuk tanda tangan digital yang sesuai PAdES. TCPDF-Next mendukung empat level tanda tangan — dari basic (B-B) hingga archival (B-LTA) — melalui PadesOrchestrator, TsaClient, dan modul LTV. Semua method tanda tangan mengembalikan static untuk chaining.

Referensi Cepat

Class / EnumTujuan
CertificateInfoMemuat sertifikat penandatangan (PEM atau PKCS#12)
SignatureLevelEnum: PAdES_B_B, PAdES_B_T, PAdES_B_LT, PAdES_B_LTA
TsaClientClient timestamp authority RFC 3161
SignatureAppearanceWidget tanda tangan visible atau invisible
OcspClientPengecekan revokasi online RFC 6960
CrlFetcherPengambilan CRL distribution point RFC 5280

Level Tanda Tangan

LevelApa yang TermasukValiditas
B-B (Basic)Tanda tangan + sertifikat penandatanganValid selama sertifikat tidak dicabut
B-T (Timestamp)B-B + timestamp RFC 3161Membuktikan tanda tangan ada sebelum titik waktu tertentu
B-LT (Long-Term)B-T + DSS dengan respons OCSP/CRLDapat diverifikasi setelah sertifikat kedaluwarsa
B-LTA (Archival)B-LT + document timestamp + archival loopDapat diverifikasi tanpa batas waktu

Siklus Hidup Tanda Tangan PAdES

mermaid
sequenceDiagram
    participant App
    participant Core
    participant TSA as Server TSA
    participant OCSP as OCSP Responder
    App->>Core: sign(certificate, key)
    Core->>Core: PAdES B-B (embedded)
    Core->>TSA: RFC 3161 timestamp
    TSA-->>Core: Token timestamp
    Core->>Core: PAdES B-T
    Core->>OCSP: Pengecekan sertifikat
    OCSP-->>Core: Respons OCSP
    Core->>Core: PAdES B-LT
    Core->>Core: PAdES B-LTA (arsip)

Memuat Sertifikat

Dari File PEM

php
use Yeeefang\TcpdfNext\Security\Signature\CertificateInfo;

$cert = CertificateInfo::fromFiles(
    certPath: '/path/to/certificate.pem',
    keyPath: '/path/to/private-key.pem',
    password: 'key-password',
    extraCerts: '/path/to/ca-chain.pem',  // sertifikat intermediate opsional
);

Dari PKCS#12 (.p12 / .pfx)

php
use Yeeefang\TcpdfNext\Security\Signature\CertificateInfo;

$cert = CertificateInfo::fromPkcs12(
    p12Path: '/path/to/certificate.p12',
    password: 'pkcs12-password',
);

Contoh Penandatanganan

php
use Yeeefang\TcpdfNext\Core\Document;
use Yeeefang\TcpdfNext\Security\Signature\CertificateInfo;
use Yeeefang\TcpdfNext\Contracts\SignatureLevel;
use Yeeefang\TcpdfNext\Security\Timestamp\TsaClient;

$cert = CertificateInfo::fromFiles(
    certPath: '/path/to/certificate.pem',
    keyPath: '/path/to/private-key.pem',
    password: 'key-password',
);

// PAdES B-B (Basic) — tanda tangan saja
$pdf = Document::create()
    ->setSignature($cert, SignatureLevel::PAdES_B_B)
    ->addPage()
    ->setFont('Helvetica', '', 12)
    ->cell(0, 10, 'Dokumen bertanda tangan (B-B)')
    ->save('signed-bb.pdf');

// PAdES B-T (Timestamp) — tanda tangan + timestamp
$tsa = new TsaClient('https://freetsa.org/tsr');
$pdf = Document::create()
    ->setSignature($cert, SignatureLevel::PAdES_B_T, $tsa)
    ->addPage()
    ->cell(0, 10, 'Bertanda tangan dengan timestamp (B-T)')
    ->save('signed-bt.pdf');

// PAdES B-LTA (Archival) — validasi jangka panjang penuh
$pdf = Document::create()
    ->setSignature($cert, SignatureLevel::PAdES_B_LTA, $tsa)
    ->addPage()
    ->cell(0, 10, 'Tanda tangan arsip (B-LTA)')
    ->save('signed-blta.pdf');

TsaClient mendukung autentikasi opsional. Verifikasi nonce dan DNS pinning diaktifkan secara default untuk mencegah serangan replay dan SSRF.

php
$tsa = new TsaClient(
    url: 'https://tsa.example.com/timestamp',
    user: 'tsa-user',
    pass: 'tsa-password',
);

Validasi Jangka Panjang (B-LT / B-LTA)

Untuk level B-LT dan B-LTA, data revokasi diambil dan di-embed secara otomatis:

  • OcspClient — query OCSP responder (RFC 6960) dari ekstensi AIA sertifikat
  • CrlFetcher — download CRL dari distribution point (RFC 5280)
  • DSS — menyimpan respons OCSP dan CRL di Document Security Store
  • VRI — data validasi per tanda tangan (opsional, sesuai rekomendasi ETSI)

B-LTA juga menambahkan document timestamp, memungkinkan archival loop — dokumen dapat di-re-timestamp untuk memperpanjang validitas tanpa batas.

Tampilan Tanda Tangan

Secara default, tanda tangan bersifat invisible. Untuk membuat widget tanda tangan visible:

php
use Yeeefang\TcpdfNext\Security\Signature\SignatureAppearance;

$pdf = Document::create()
    ->setSignature($cert, SignatureLevel::PAdES_B_T, $tsa)
    ->setSignatureAppearance(
        SignatureAppearance::visible(x: 20, y: 250, w: 80, h: 30)
    )
    ->addPage()
    ->cell(0, 10, 'Dokumen dengan tanda tangan visible')
    ->save('visible-signature.pdf');

Untuk tanda tangan invisible secara eksplisit:

php
$pdf->setSignatureAppearance(SignatureAppearance::invisible());

Algoritma dan Referensi Method

Algoritma tanda tangan melalui phpseclib3: RSA PKCS#1 v1.5 (default, kompatibilitas terluas) dan RSASSA-PSS (padding lebih kuat, direkomendasikan untuk deployment baru).

php
$pdf->setSignature(
    CertificateInfo   $cert,           // Sertifikat dan private key
    SignatureLevel    $level,           // B-B, B-T, B-LT, atau B-LTA
    ?TsaClient        $tsa   = null,   // Diperlukan untuk B-T, B-LT, B-LTA
);

Mengembalikan static untuk chaining. Tanda tangan diterapkan selama save() atau output().

Didistribusikan di bawah lisensi LGPL-3.0-or-later.