Hei,
Apacheen on konfattu SSL-tuet ja asiakkaan koneessa on .pem-muotoinen SSL-sertifikaatti, jolla asiakas pääsee http://domain.fi/testi.php -sivulle.
Kuinka saan luettua PHP:llä asiakkaan sertifikaatin tiedot? Tarkoitus olisi tunnistaa sivulle tuleva asiakas (jolla siis yksilöivä sertifikaatti asennettu) ja kirjoittaa tiedot kantaan. Eli sertifikaatista pitäis saada ulos joko koko sertifikaatti, tai sitten yksilöivät tiedot: nimi, organisaatio jne..
Verkossa tuntuu olevan todella vähän järkevää materiaalia tähän aiheeseen.
Löysin PHP-Classes -saitilta jonkin käyttötarkoitukseesi mahdollisesti sopivan luokan, tässä esimerkkikoodia:
<?php require_once 'OpenSSL.php'; require_once 'OpenSSL/Cert.php'; PEAR::setErrorHandling(PEAR_ERROR_PRINT); try { /** * Files were generated with openssl * * SELF-SIGNED CERTIFICATE * openssl req -new -x509 -keyout cakey.pem -out cacert.pem -days 3650 -text * */ //Create a new OpenSSL_Cert class $Cert = new Crypt_OpenSSL_Cert('certs/cacert.pem', 'certs/cakey.pem', 'passphrase'); //Class handler for OpenSSL_Cert class $OpenSSL = new Crypt_OpenSSL($Cert); } catch (Crypt_OpenSSL_Cert_Exception $e) { echo $e->getMessage() . "\n"; } //Other way to setup files /* $Cert->setCert('certs/testcert.crt'); $Cert->setKey('certs/testcert.key', 'passphrase'); */ //Get some info about cert echo "Certificate's common name: " . $Cert->subject['commonName'] . "\n"; //Check if a private key corresponds to a certificate if($Cert->check()) { echo "Cert is OK!\n"; } //Verify signature $data = "Follow the white rabit!"; $signature = $OpenSSL->signature($data); if($OpenSSL->verify('Follow the white rabit!', $signature)) { echo "\$signature is OK!\n"; } //Encryption via cert $ar = $OpenSSL->encrypt('The matrix is YOU!'); // Decription echo $OpenSSL->decrypt($ar['0'], $ar['1']); ?>
Kiitos nopeasta vastauksesta.
Näyttäisi siltä, että tämä luokkaa vaatii, että sertifikaattitiedostot ovat paikallisesti saatavilla.
Ongelman ydin kuitenkin on se, että client tekee https-requestin ohjelmallisesti php-skriptilleni. Sertifikaatin tiedot pitäisi siis repiä tästä requestista ulos skriptille. Apachehan tekee saman tempun sisäisesti tunnistaessaan, onko clientilla voimassa oleva sertifikaatti, kun request saapuu palvelimelle.
Case Closed.
Ongelmaan löytyikin taas aika simppeli ratkaisu.
phpinfo() antaa kivan listan SERVER-muuttujista, jotka ovat voimassa ssl-yhteyden ollessa aktiivisena. Tuolta saan kaivettua tarvittavat tiedot.
Aihe on jo aika vanha, joten et voi enää vastata siihen.