====== 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 ...

Datos de variables globales

ENV

\n"; ?>
ClaveValor
" . $key . "" . $_ENV[$key] . "

SERVER

\n"; ?>
ClaveValor
" . $key . "" . $_SERVER[$key] . "

SESSION

\n"; ?>
ClaveValor
" . $key . "" . $_SESSION[$key] . "

COOKIE

\n"; ?>
ClaveValor
" . $key . "" . $_COOKIE[$key] . "

GLOBALS

\n"; ?>
ClaveValor
" . $key . "" . $GLOBALS[$key] . "

OCSP Check

Para probar un poco: http://dnie.locolandia.net => https://dnie.locolandia.net:8443