Digital Signatur med Apache og PHP

Tags:    php
Skrevet af Bruger #890 @ 29.12.2007

Indledning


En af de ting som staten har gjort rigtigt på IT området er den Digitale Signatur. Den er baseret på eksisterende standarder og ikke i modsætning til andre området et specielt MS-only system. Netop dette faktum er nok også grunden til at den i hvert fald for mig har fungeret upåklageligt i Firefox. Dog er det måske værd at bemærke at enkelte sites i hvert fald på et tidspunkt stadig har benyttet sig at teknologi der kun var IE kompatibelt. Den digitale signatur er dog i virkeligheden meget simpel at bruge, og kræver intet andet end en Apache server der understøtter SSL, PHP, OpenSSL samt et ssl certifikat. SSL certifikatet kan sagtens være self-signed. Men for at undgå advarslen ved brug, kan der købes et af de billige ssl certifikater til omkring 100 kr, dette burde ikke vælte noget budget. For at kunne teste eksemplerne kræves også et digitalt certifikat udstedt af TDC. Dette er ikke noget man kan sætte op på de fleste webhoteller, da det kræver ændringer i Apaches konfiguration. Det er værd at bemærke at hvis man ønsker at bruge det digitale certifikat i en virksomhed kræver det en aftale med TDC. Men til personlige sider eller test sites er det så vidt jeg ved ikke nødvendigt.
I denne artikel vil jeg gennemgå den krævede opsætning, hvordan man kan kontrollere at certifikatet er gyldigt samt bruge data fra PHP og dermed bruge det som login.

Apache opsætningen


I min situation har jeg sat en virtual host op med SSL. Jeg har valgt at lade denne virtualhost som jeg kalder ssl.lokedupont.info kun modtage trafik på http/s porten 443. Da den kun skal bruges til SSL krævende handlinger. Derudover har jeg valgt den kun skal kræve digital signatur for ssl.lokedupont.info/digitalcert da jeg godt vil bruge min SSL forbindelse til andet også. Denne konfiguration ser sådan ud:
Fold kodeboks ind/udKode 

SSLCACertificateFile peger på en lokal kopi af TDC’s rodcertifikat som kan hentes på www.certifikat.dk/repository SSLCACertificateFile tjekker om det digitale certifkat som browseren sender er udstedt af den angivne CA (Certificate Authority – i dette tilfælde TDC)
SSLOptions angiver at jeg fra PHP gerne vil have adgang til variabler med certifkatdata. SSLCertificateFile og SSLCertificateKeyFile er konfigurationen af serverens SSL certifikat. SSLVerifyClient angiver om serveren skal kræve at browseren sender et digitalt certifikat. Det er generelt set none, og require for /digitalcert som omtalt ovenfor.
En ting der er værd at bemærke i den ovenstående konfiguration er at jeg ikke angiver en CRL eller spærreliste. Dette skyldes at Apache i modsætning til fx IIS kun kan bruge en lokal spærreliste, og at den kun loades ved startup. Derfor vælger jeg at kontrollere certifikatet i PHP via OCSP som jeg omtaler senere.

Brug af certifkatdata i PHP


Der er nogle bestemte informationer som er interessante at trække ud og bruge. Hele certifikatet ligger i variablen $_SERVER['SSL_CLIENT_CERT'] og den har vi ikke tænkt os at parse manuelt, så vi lader PHPs OpenSSL extension gøre det for os. Dette gøres således:
Fold kodeboks ind/udKode 

Vores variabel indeholder nu et noget mere overskueligt array over data i certifikatet. De interessante dele er $cert['subject']['CN'], $cert['subject']['serialNumber'] og $cert['subject']['O'].
CN er en forkortelse for ”Common Name” og er navnet på personen certifikatet hvis der tale om et personcertifikat. For personer mellem 15 og 18 år vil der til navnet være tilføjet (Ung under 18). På virksomhedscertifikater vil CN være navnet på virksomheden, sammen med afdelingen og funktionen, og for medarbejdercertifikater vil det være navnet på medarbejderen.
serialNumber er serienummeret på den ”person” der tale om. For personcertifikater er det PID: efterfulgt af en række tal og bindestreger. For virksomhedcertifikater og medarbejdercertifikater er det CVR: efterfulgt ar virksomhedens CVR nummer samt RID: efterfulgt af personid’et hos virksomheden. PID kan efter speciel aftale med TDC konverteres til CPR-nr, ved hjælp af en webservice hos TDC.
O indeholder for person certifikater ”Ingen organisatorisk tilknytning” og for virksomheds og medarbejdercertifikater virksomhedsnavn efterfulgt af CPR-nr.
Da Apache ikke er sat op med CRL er det vigtigt at tjekke certifikatets gyldighed. Dette gør jeg via OSCP gennem OpenSSL på følgende måde:
Fold kodeboks ind/udKode 

Ocesca.crt filen er den samme som jeg bruger i min virtual host konfiguration. OCSP bliver opdateret hver minut med spærrede certifikater, så det kan næsten ikke blive mere aktuelt. Bemærk at det serialNumber jeg bruger i ovenstående kode er en anden end [’subject’][’serialNumber’] her er der i stedet tale om et serienummer der identificerer det enkelte certifikat og ikke den enkelte person.
Godt nok, hvad så nu?
Først og fremmest skal vi være opmærksomme på at personer der bruger en browser med TDCs Digital Signatur plug-in vil blive spurgt om kodeordet til signaturen ved hver http request som udbeder certifikatoplysninger. Det er derfor en god idé at sætte en cookie, eller bruge sessions og så sende personen videre til et sted på sin server der ikke kræver certifkatoplysninger ved hver request. I mit tilfælde betyder det at jeg sender folk videre fra /digitalcert til /admin, da jeg ikke har en special <Location> parameter for /admin. Men inden da sørger jeg for at smide de oplysninger jeg behøver i min session. Så min session gemmer både CN og serialNumber så jeg kan bruge dette senere. Dette kunne fx gøres således:
Fold kodeboks ind/udKode 

Hvis man så placerer ovenstående i /digitalcert/index.php på sin SSL virtual host vil man kunne modtage folk i /admin/velkommen.php med gyldige personcertifikater og vil kunne tilgå de nødvendige oplysninger i sin session.

Afslutning


Nu overvejer du jo nok hvad du kan bruge alt denne nye viden til og svaret er enkelt. Du kan jo fx lave en ny online underskriftsindsamling som rent faktisk kan bruges til noget. Du kan bruge det som login på din blog. Du kan bruge det som login i dit admin interface til din hjemmeside, det er sådan set helt op til dig.
Der kan findes en bunke god information om den Digital Signatur hos tdc på: http://erhverv.tdc.dk/digital/ se især under Teknisk Partnerinfo.

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (2)

User
Bruger #1330 @ 18.01.08 08:31
Loke!
du er og bliver min gud, lige præcist hvad jeg har brug for til et eksamensprojekt! 1000 tak for en super artikel og nogle gode ideer til brug!
User
Bruger #8222 @ 15.02.09 15:05
Ikke dybdelæst artiklen, men dette emne er fantastisk at tage op! God idé og god udførelse! kort og kontant
Du skal være logget ind for at skrive en kommentar.
t