Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: SSL-sertifikaatin tietojen lukeminen

Sqweedle [24.09.2009 10:44:28]

#

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.

Teemu-root [24.09.2009 11:24:30]

#

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']);
?>

http://www.phpclasses.org/browse/package/4509.html

Sqweedle [24.09.2009 12:09:56]

#

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.

Sqweedle [24.09.2009 13:52:01]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta