====== Autenticación DNIe con Apache2 y PHP ======
===== Situación =====
Queremos autenticar una Web utilizando el [[http://www.dnielectronico.es/|DNI Electrónico]], para ello vamos a utilizar:
* **Cliente**: Cualquier cliente que tenga instalado y funcionando el [[http://www.dnielectronico.es/|DNI Electrónico]]
* **Servidor**: [[http://www.ubuntu.com|Ubuntu]] + [[http://httpd.apache.org/|Apache2]] + [[www.php.net|PHP5]]
===== Instalación =====
Para ello, instalamos Apache2 y php5:
apt-get install apache2 libapache2-mod-php5 php5
===== Certificados =====
Nos harán falta un par de claves SSL (privada y pública para nuestro servidor apache) las cuales colocaremos en formato de PEM en el fichero: /etc/apache2/ssl/apache.pem. Un buen documento de como generar nuestra propia clave es: [[http://www.tc.umn.edu/~brams006/selfsign.html]]
Y la clave pública de la CA de la policía, la cual se puede obtener de: [[http://www.dnielectronico.es/seccion_integradores/autoridades_cert.html|Autoridades de Certificación del DNIe]]
Dicha clave la situaremos en formato PEM en: /etc/ssl/certs/acraiz-dnie.cer
$ openssl x509 -in ACRAIZ-SHA1.crt -inform DER -out ACRAIZ-SHA1.crt -outform PEM
$ sudo cp ACRAIZ-SHA1.crt /etc/ssl/certs/acraiz-dnie.cer
===== Configuración =====
Configuramos apache2 para que soporte SSL en el puerto 443 (https):
# echo "Listen 8443" >> /etc/apache2/ports.conf
Y el servicio virtual para que soporte https en el fichero: /etc/apache2/sites-available/default-ssl
NameVirtualHost *:443
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.pem
SSLCACertificateFile /etc/ssl/certs/acraiz-dnie.cer
SSLVerifyClient require
SSLVerifyDepth 2
SSLOptions +StdEnvVars +ExportCertData
DocumentRoot /var/www/
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/access.log combined
Luego habilitamos la configuración de apache:
# a2ensite default-ssl
# /etc/init.d/apache2 restart
===== PHP y los datos del DNIe + Comprobación OCSP =====
Apache envía los datos de la autenticación mediante variables de entorno globales.
La comprobación OCSP se realiza utilizando PHP + OpenSSL, debido a que mod_ssl para apache, no soporta OCSP.
Ejemplo de aplicación en PHP para obtener dichas variables es:
Session and more ...
if ($_SERVER['SSL_CLIENT_S_DN'])
print "Autenticado con DNIe";
else
print "Autenticar con Login y Pass";
?>
Datos de variables globales
ENV
| Clave | Valor |
foreach (array_keys($_ENV) as $key)
print "| " . $key . " | " . $_ENV[$key] . " |
\n"; ?>
SERVER
| Clave | Valor |
foreach (array_keys($_SERVER) as $key)
print "| " . $key . " | " . $_SERVER[$key] . " |
\n"; ?>
SESSION
| Clave | Valor |
foreach (array_keys($_SESSION) as $key)
print "| " . $key . " | " . $_SESSION[$key] . " |
\n"; ?>
COOKIE
| Clave | Valor |
foreach (array_keys($_COOKIE) as $key)
print "| " . $key . " | " . $_COOKIE[$key] . " |
\n"; ?>
GLOBALS
| Clave | Valor |
foreach (array_keys($GLOBALS) as $key)
print "| " . $key . " | " . $GLOBALS[$key] . " |
\n"; ?>
OCSP Check
Para probar un poco:
http://dnie.locolandia.net => https://dnie.locolandia.net:8443