A Programozás Világa programozás tanúsítvány pdf forráskód Zend keretrendszer

Meglévő PDF-re tanúsítvány elhelyezése letölthető forráskóddal

2020-06-03
A programozásod során talán Te is biztos már belefutottál abba a problémába, hogy miképp helyezz el egy meglévő PDF-re tanúsítványt.

Sokszor kell dolgoznunk tanúsítványokkal. Mindennapi feladataink közé tartozik a cer, pem, p12, pfx és egyéb olyan kiterjesztések, melyeket számos esetben oda-vissza kell konvertálgatni. A tanúsítványtípusok megértése egy külön területbe tartozik. Tudjuk, hogy sokunk számára bődületes segítséget nyújt, ha pl. egy weboldal domain nevére igénylünk egy tanúsítványt, és 2-3 klikkel már életre is kel. Természetesen most nem beszélünk a weboldal forráskódokról, Cross Domain kapcsolati problémákról.
Amiről beszélni fogunk, az egy olyan nem mindennapi helyzet, ami megoldást nyújt a meglévő PDF-re való, meglévő tanúsítvány elhelyezéséről.

De mikor is van szükség az ilyen jellegű projektekre?

Például olyan pénzügyi szervezetek, akik nem csak papíron kötnek szerződést, hanem online téren is. Egyszerűsítve: a tanúsítványra azért van szükség, mert a pénzügyi szerv előállítja a dokumentumot tanúsítvánnyal védve, hogy azok a felek, akik nekiállnának módosítani a dokumentumon (pl. hekkeléssel), bizton állíthatom, hogy nem lesz könnyű dolguk. Módosítani csak úgy lehet egy tanúsítvánnyal ellátott dokumentumot, ha módosítást követően mentjük. Ekkor viszont a tanúsítvány kikerül a dokumentumból. A pénzügyi szerv részére történő visszaküldés esetén azonnal fel fog tűnni az illetékesnek, hogy elveszett a tanúsítvány, ami természetesen a szerződéskötést azonnal meg is állítja.

Viszont a tanúsítvány kezelésének jelentős terhe továbbra is a programozók vállát nyomja, hiszen a fejlesztőknek megoldást kell találniuk erre a problémára.

Melyet mi is kerestünk…

Mi is a probléma?

Léteznek olyan szervek, akik megoldják a tanúsítvánnyal való ellátást havi díjazásért. Sajnos sok megrendelő, ezeket az összegeket nem tudja megfizetni, nem beszélve arról, hogy ha olcsóbb megoldás is létezik, akkor miért ne azt válasszák? Persze nem szabad figyelmen kívül hagyni, hogy a külső szolgáltatók esetén jellemzően elveszik, vagy erősen korlátozódik a szoftver tovább fejleszthetőségének lehetősége. Léteznek még Java alapú megoldások, viszont a Java (Tomcat) szerver telepítésétől a szolgáltatatók menekülnek.

Mi a megoldás?

Nehéz a megoldást megtalálni! Ilyen generáló programok esetén továbbfejlesztett TCPDF, FPDI programok adnak lehetőséget, viszont ezekkel a lehetőségekkel az a baj, hogy csak új PDF generálással képesek elhelyezni a dokumentumra a tanúsítványt. Meglévő dokumentumra nem! Éppen ezért hosszas keresgélés után sajnos csak néhány megoldást találtunk. A fórumok konganak a kérdések megválaszolatlanságaitól, számos segédoldal a becsapásra megy rá. Néhány oldal kb 3-10%-os segítségnyújtásából és a programozók lelkes kitartásából született meg az eredmény.

Kezdjünk neki a szakmai oldalának:

A program a Zend keretrendszert igényli, mely telepítése önmagában egy őrületes kihívás. Pl. külön Composert kell alkalmazni. Számos Zend verzió, számos composer.json nehezíti az olyanok munkáját, akik nem a Zend és Composerek területén erősek. Arról nem is beszélve, hogy ha a szerverszolgáltató nem engedélyezi a Composerek futtatását, akkor nagy nehézségekkel fogunk szembenézni. 

A választásunk a Zend keretrendszerre esett, hiszen egy .com oldalon talált programozó kolléga (részben) megoldotta ezt a feladatot.

Ami szükséges hozzá:

Pdf.php kód:

error_reporting(E_ALL); //kikapcsoláshoz 0 értéket adj.
ini_set("display_errors", 1); //hibák kiírásának tiltásához 0 értéket írj.
ini_set('include_path',ini_get('include_path').PATH_SEPARATOR.realpath('./'));

require_once('Zend/Loader/Autoloader.php'); //a letöltési dokumentum tartlmazza
$loader = Zend_Loader_Autoloader::getInstance();
$pdf = Zend_Pdf::load('eredeti.pdf'); //ez a fájl az, amit majd tanúsítvánnyal fogsz ellátni

$signature = new Zend_Pdf_Signature('tanusitvanyod.pem','jelszó','tmp',false); //készítsd el a pem fájlodat, add meg a tanúsítvány kódját, mondd meg a programnak, hogy mi legyen az átmeneti temp könyvtár és ha szeretnél időpecsétet is, a false értéket írd át true-ra
$signature->setSigParams(array(
  'Name' => 'Név',
  'Location' => 'Cím',
  'Reason' => 'Indok',
  'ContactInfo' => 'Kapcsolat'
)); //tetszőlegesen add meg az adatokat

$signature->setTSAParams(array(
  'TSA_username' => '',
  'TSA_password' => '',
  'TSA_url'   => 'http://timestamping.edelweb.fr/service/tsp',
  'TSA_cert'   => '',
  'TSA_algorithm' => 'sha1'
)); //add meg az időpecsét adatait

$pdf->setSignature($signature);
$fp = fopen('eredmeny.pdf','w'); //eredmeny.php néven kerül mentésre a fájl.
$pdf->render(false,$fp);

fclose($fp);
?>

Letölthető: Zend keretrendszer, módosított PDF hívó és generáló függvények, Composer nélkül FTP-n feltölthető renderelt programkódok. Használat során légy körültekintő. A teszteléshez PHP 7.3 rendszert használtunk.