Sei sulla pagina 1di 20

S ERIE A PLICACIONES W EB

DE DOCUMENTOS

C MO

HACER ? Y

SEGURAS CON

A PACHE , O PEN SSL, GPG

PHP

T.S.U. Leonardo Caballero Grupo de Usuarios Linux de Mrida - GULMER Web Site: http://www.gulmer.org.ve/ Linux User # 369081 / IRC Nick: macagua E-mail: leonardocaballero@gmail.com Web Site: http://lcaballero.8k.com/

Palabras clave
HowTo, Servidor Web Seguro, Apache, OpenSSL, PKI, Certificado Digital, PGP, GPG, Triatlon de Software Libre, Mrida.

Resumen
El presente HowTo describe los servicios y aplicaciones necesarias para mi proyecto de software libre que defend en el I Triatlon Regional de Software Libre Mrida para lograr esto estuve 4 horas investigando en Internet y consegu varios manuales, pero estaban desactualizados con respecto a mi distribucin Debian GNU/Linux, o simplemente daban por entendido muchas cosas que yo no saba, por lo que para resolver mi problema tuve que utilizar como mnimo 3 manuales que son diferentes en cuanto su distribucin, versin de paquetes, entre otras, logre adaptarlo a mi solucin. Esta dificultad en la documentacin me da base para realizar este HowTo bajo las caractersticas de requerimientos que se citan el en mismo apartados. El mismo aborda los siguientes temas: Introduccin al tema, definiciones a cerca de HTTPS, RSA, Triple DES, X.509, OpenSSL, Mod_ssl, PGP, PGP y GPG. Luego se citan los requerimientos de software para que todo funcione. Seguidamente se explican los procedimientos de instalacin y configuracin de los servicios del proyecto. Adems el desarrollo de la aplicacin demostrativa con cdigos fuentes se ofrecen recursos en la red.

Introduccin
Este HowTo es sobre Cmo hacer aplicaciones Web seguras con conexiones cifradas con SSL?. As, quien quiera empezar a montarse en casa un pequeo "laboratorio de pruebas" ya tiene por donde empezar; el mismo describe los servicios y aplicaciones necesarias para mi proyecto de

1/20

software libre el cual defend en el I Triatlon Regional de Software Libre Mrida; para lograr esto estuve 4 horas investigando en Internet y consegu varios manuales pero estaban desactualizados con respecto a mi distribucin Debian GNU/Linux, o simplemente daban por entendido muchas cosas que yo no saba, por lo que para resolver mi problema tuve que utilizar como mnimo 3 manuales que son diferentes en cuanto su distribucin, versin de paquetes, entre otras, logre adaptarlo a mi solucin. A continuacin les dejo algunas definiciones bsicas que debe manejar para poder realizar el proceso con xito :)

HTTPS.
Es la versin segura del protocolo HTTP, inventada en 1996 por Netscape Communications Corporation. No es un protocolo separado de HTTP. Se trata de una combinacin de este ltimo con un mecanismo de transporte SSL o TLS, garantizando una proteccin razonable durante la comunicacin cliente-servidor. Es ampliamente utilizado en la red mundial (WWW o World Wide Web) para comunicaciones, como transacciones bancarias y pago de bienes y servicios. El servicio utiliza el puerto 443 por TCP para realizar las comunicaciones (la comunicacin normal para HTTP utiliza el 80 por TCP). El esquema URI (Uniform Resource Identifier o Identificador Uniforme de Recursos) es, comparando sintaxis, idntico al de HTTP (http:), utilizndose como https: seguido del subconjunto denominado URL (Uniform Resource Locator o Localizador Uniforme de Recursos). Ejemplo: https://www.dominio.org/. [CEM-bot 2007].

RSA.
Es un algoritmo para el ciframiento de claves pblicas el cual fue publicado en 1977, patentado en EE.UU. en 1983 por el el Instituto Tecnolgico de Michigan (MIT). RSA es utilizado ampliamente en todo el mundo para los protocolos destinados al comercio electrnico. Sus siglas son acrnimo de los apellidos de sus autores, Ron Rivest, Adi Shamir y Len Adleman. [LordT 2007].

Triple DES.
Tambin conocido como TDES, es un algoritmo que realiza un triple cifrado DES, desarrollado por IBM en 1978. Su origen tuvo como finalidad el agrandar la longitud de una clave sin necesidad de cambiar el algoritmo de ciframiento, lo cual lo hace ms seguro que el algoritmo DES, obligando a un atacante el tener que triplicar el nmero de operaciones para poder hacer dao. A pesar de que actualmente est siendo reemplazado por el algoritmo AES (Advanced Encryption Standard, tambin conocido como Rijndael), sigue siendo estndar para las tarjetas de crdito y operaciones de comercio electrnico. [TXiKiBoT 2007].

X.509.

2/20

Es un estndar ITU-T (Estandarizacin de Telecomunicaciones de la International Telecommunication Union) para infraestructura de claves pblicas (PKI, o Public Key Infrastructure). Entre otras cosas, establece los estndares para certificados de claves pblicas y un algoritmo para validacin de ruta de certificacin. Este ltimo se encarga de verificar que la ruta de un certificado sea vlida bajo una infraestructura de clave pblica determinada. Es decir, desde el certificado inicial, pasando por certificados intermedios, hasta el certificado de confianza emitido por una Autoridad Certificadora (CA, o Certification Authority). [Ignacioerrico 2007].

OpenSSL.
Es una implementacin libre y cdigo abierto, de los protocolos SSL (Secure Sockets Layer o Nivel de Zcalo Seguro) y TLS (Transport Layer Security, o Seguridad para Nivel de Transporte). Est basado sobre el extinto proyecto SSLeay, iniciado por Eric Young y Tim Hudson, hasta que stos comenzaron a trabajar para la divisin de seguridad de EMC Corporation. [OpenSSL 2007].

Servidor HTTP Apache.


Es un software (libre) servidor HTTP de cdigo abierto para plataformas Unix (BSD, GNU/Linux, etc.), Windows, Macintosh y otras, que implementa el protocolo HTTP/1.1 y la nocin de sitio virtual. [VolkovBot 2007].

Mod_ssl.
Es un mdulo para el servidor HTTP Apache, el cual provee soporte para SSL versiones 2 y 3 y TLS versin 1. Es una contribucin de Ralf S. Engeschall, derivado del trabajo de Ben Laurie.

PGP.
Es un programa desarrollado por Phil Zimmermann y cuya finalidad es proteger la informacin distribuida a travs de Internet, mediante el uso de criptografa de clave pblica, as como facilitar la autenticacin de documentos gracias a firmas digitales. Sus siglas significa Pretty Good Privacy (privacidad bastante buena). [Nolaiz 2007].

GPG.
GPG o Gnu Privacy Guard es una herramienta para cifrado y firmas digitales, que viene a ser un reemplazo del PGP (Pretty Good Privacy), pero con la principal diferencia que es software libre licenciado bajo la GPL y se puede ejecutar en Linux y en MS Windows. [RobotQuistnix 2007].

PHP
Es un lenguaje de programacin usado normalmente para la creacin de pginas web dinmicas. PHP es un acrnimo recursivo, que significa "PHP Hypertext Pre-processor" (inicialmente PHP Tools, o, Personal Home Page Tools), y se trata de un lenguaje interpretado. ltimamente tambin

3/20

puede ser utilizado para la creacin de otro tipo de programas incluyendo aplicaciones con interfaz grfica, usando las bibliotecas Qt o GTK+. [Jarisleif 2007].

HTML
Es el acrnimo ingls de HyperText Markup Language, que se traduce al espaol como Lenguaje de Etiquetas de Hipertexto. Es un lenguaje de marcado diseado para estructurar textos y presentarlos en forma de hipertexto, que es el formato estndar de las pginas web. Gracias a Internet y a los navegadores como Internet Explorer, Opera, Firefox, Netscape o Safari, el HTML se ha convertido en uno de los formatos ms populares y fciles de aprender que existen para la elaboracin de documentos para la web. [CienciaAlPoder 2007].

Hojas de estilo en cascada


Las hojas de estilo en cascada (Cascading Style Sheets, CSS) son un lenguaje formal usado para definir la presentacin de un documento estructurado escrito en HTML o XML (y por extensin en XHTML). [CienciaAlPoder 2007].

Cliente de correo electrnico.


Un cliente de correo electrnico, o tambin llamado en ingls mailer o Mail User Agent (MUA), es un programa de ordenador usado para leer y enviar e-mails. Originalmente, los clientes de correo electrnico fueron pensados para ser programas simples para leer los mensajes del correo de usuario, enviados por el agente de reparto de correo (MDA) conjuntamente con el agente de transferencia de correo (MTA), a un buzn local. [AlleborgoBot 2007].

Novell Evolution.
Evolution o Novell Evolution es un gestor libre de informacin personal y de trabajo en grupo para GNOME, desarrollado originalmente por Ximian ahora es parte oficial del escritorio de GNOME. Combina administracin de correo electrnico, calendario, agenda y lista de tareas. Forma parte del conjunto GNOME Office. Su interfaz grfica y funcionalidad imita bastante a la aplicacin Microsoft Outlook. Evolution puede opcionalmente conectarse a servidores Microsoft Exchange, usando su interfaz web y un aadido conocido como Connector. [Estirabot 2007].

Requerimientos
No creo que hoy en da sea difcil instalar ambas cosas en cualquier distribucin o plataforma estos son los nicos requisitos previos. Tampoco pienso que sea muy diferente en Windows. Los pasos que se detallan a continuacin han sido realizados en los siguientes paquetes para GNU/Linux:

4/20

Sistema Operativo Debian GNU/Linux 4.0 Servidor HTTP Apache 2 v2.2.3-4 OpenSSL v0.9.8c-4. GPGV v1.4.6-2 PHP5 v5.2.0-8+etch3

Es necesario disponer de una direccin IP pblica (aunque para esta demostracin no es necesario funciona con una IP privada) para cada sitio de red virtual que se quiera configurar con soporte SSL/TLS. Debido a la naturaleza de los protocolos SSL y TLS, no es posible utilizar mltiples sitios de red virtuales con soporte SSL/TLS utilizando una misma direccin IP. Cada certificado utilizado requerir una direccin IP independiente en el sitio de red virtual. El paquete mod_ssl (modulo de SSL para Apache 2) instala el fichero /etc/apache2/modsenabled/ssl.conf, mismo que no es necesario modificar, puesto que se utilizarn ficheros de inclusin, con extensin *.conf, dentro del directorio /etc/apache2/mods-enabled/ , a fin de respetar la configuracin predeterminada y poder contar con la misma, que es funcional, brindando un punto de retorno en el caso de que algo saliera mal.

Instalacin y configuracin de los Servidor HTTP Apache, OpenSSL, GPGV y PHP.


Aunque supongo es igual que con distribuciones basadas en Debian, como siempre. ;)

Instalar Apache2: Se debe instalar en su sistema de pruebas el paquete Apache2, por comodidad se usar las herramientas de gestin de paquetes de Debian como Aptitude y lo puede realizar con el siguiente comando:

# aptitude install apache2

Habilitar el mdulo ssl: Luego de instalar el servidor Apache 2 se debe habilitar el modulo de SSL y lo puede realizar con el siguiente comando:

# a2enmod ssl

5/20

Instalar OpenSSL: Se debe instalar en su sistema de pruebas el paquete OpenSSL, por comodidad se usar las herramientas de gestin de paquetes de Debian como Aptitude y lo puede realizar con el siguiente comando:

# aptitude install openssl

Generar clave privada RSA: Se llamara al servidor por ej. triatlon (sustituye "triatlon" por el nombre-url suyo). Para generar una clave privada RSA protegida por contrasea lo puede realizar con el siguiente comando:

$ openssl genrsa -des3 > triatlon.key La proteccin de la clave por contrasea (para lo que puede utilizar tambin AES) presenta el inconveniente de que tendrs que teclear esta contrasea cada vez que arranques el servidor y que si la olvida se acab. :( Por eso, si prefieres la comodidad a la mxima seguridad (por ejemplo, se trata de su servidor de pruebas) y est "seguro" de que la clave no va a caer en malas manos (o no importa), puedes optar por no proteger con contrasea y lo puede realizar con el siguiente comando: $ openssl genrsa > triatlon.key

Generar CSR (Certificate Signing Request): Ahora se gener una peticin para enviar a una Autoridad de Certificacin, solicitar que firme nuestra clave y nos devuelva un certificado; este paso lo puede realizar con el siguiente comando:

$ openssl req -new -key triatlon.key > triatlon.csr Responde a las preguntas sobre pas, provincia. ciudad, empresa, nombre y e-mail. El fichero generado podras enviarlo a una autoridad de certificacin (como Verisign, de pago, o CACert, gratuita aunque no del agrado de Microsoft) para que lo firmaran y te enviaran su certificado, pero haremos algo an mejor: crearemos nuestra propia autoridad de certificacin!.

Crear nuestra propia Autoridad de Certificacin (CA):

6/20

Precaucin: (el path a CA.pl puede ser distinto en su distribucin) para localizarlo ejecute el siguiente comando: $ locate CA.pl Para generar la CA ejecute el siguiente comando: $ /usr/lib/ssl/misc/CA.pl -newca Presiona Enter y proporciona la que ser contrasea de acceso a la clave privada de esta nueva autoridad. Proporciona pas, provincia, ciudad, etc. para esta autoridad. Enhorabuena. Ya eres el feliz propietario de una flamante "Autoridad de Certificacin", contenida en el nuevo directorio demoCA. El fichero cacert.pem contiene su clave pblica, mientras que en el directorio private/cakey.pem dispones de la clave privada que te permitir crear certificados para sus "clientes".

Crear certificados: Como ejemplo, empecemos por firmar el CSR que genero en el paso llamado Generar CSR (Certificate Signing Request) y lo puede realizar con el siguiente comando:

$ openssl ca -policy policy_anything -out triatlon.crt -infiles triatlon.csr Introduce la contrasea de su autoridad cuando se te pida. Pulsa 'Y' cuando se te pregunte si deseas firmar 'Y', tambin para ejecutar (commit) el cambio en su base de datos. Vamos a generar tambin un certificado autofirmado para su propia autoridad certificadora (en el apartado 6 vers para qu). Acceda al directorio de su autoridad (demoCA) y escriba el siguiente comando: $ openssl x509 -req -days 365 -in careq.pem -out cacert.crt -signkey ./private/cakey.pem

Aadir certificado al servidor web: Es necesario aadir al servidor Apache los certificados generados por la CA y lo puede realizar con los siguientes comandos:

# cp triatlon.key /etc/apache2/

7/20

# cp triatlon.crt /etc/apache2/ Editar /etc/apache2/mods- enabled/ssl.conf para aadir el nombre, email del administrador y puerto de nuestro servidor y editar las lneas de clave y certificado para que digan as:
SSLCertificateFile /etc/apache2/triatlon.crt SSLCertificateKeyFile /etc/apache2/triatlon.key

Copiar la configuracin de sitios habilitados: No es necesario hacer un respaldo de el archivo en el directorio sites-enabled pero siempre es recomendado por si algo falla puede comparar con la configuracin original. Tambin nota que existe un enlace simblico desde /etc/apache2/sites- enabled/000- default hasta /etc/apache2/sites- available/default . Intenta, respaldarlo en el directorio sitesavailable el archivo o en otra locacin y los puede realizar con los siguientes comandos:

# cd /etc/apache2/sites-available # cp /etc/apache2/sites- available/default default_original

Establecer un enlace simblico necesario: El primer comando copia el archivo de la configuracin por defecto para el puerto 80, para usar esta copia del archivo de configuracin para el puerto 443. El segundo comando establece un enlace simblico desde el fichero 'ssl' en el directorio 'sites-available' al fichero 'ssl' en el directorio 'sitesenabled'. Esta metodologa de enlazar con enlaces simblicos entre dos directorios (como el mods-available y mods-enabled), es un explicado en fichero /etc/apache2/README. La idea general es que habilitemos ficheros de salida como enlaces simblicos creados sus partes disponibles y lo puede realizar con los siguientes comandos:

# cp /etc/apache2/sites- available/default /etc/apache2/sites- available/ssl # ln -s /etc/apache2/sites-available/ssl /etc/apache2/sites-enabled/ssl

Definiendo el document roots: Es la localizacin por defecto para las paginas HTML con la instalacin inicial de Debian /var/www y all existen en sitios no separados los archivos SSL. Yo prefiero separar para servir para paginas HTML bsicas /var/www/html y pginas SSL en /var/www-ssl/htm . Como usted quiera

8/20

trabajarlo no importa, pero para este paso creo los directorios y lo puede realizar con los siguientes comandos: # # # # # # cd /var/www mkdir html cd /var mkdir www-ssl cd www-ssl mkdir html

Configurar los virtual hosts: Aqu usted necesita definir en el archivo de configuracin del Apache la IP de su servidor, nombre DNS (si existe) y el document roots (directorio raz) que se creo en el anterior paso. Para configurar el puerto 80 del HTTP, ejecute el siguiente comando:

# vim /etc/apache2/sites- available/default Nota: Observe lo siguiente que debes cambiar o agregar en la configuracin de los Virtual Host.
NameVirtualHost *:80 <VirtualHost *:80> ServerName localhost DocumentRoot /var/www/html

Nota: Use su IP asignada o el nombre DNS seguido con ":80". Si usted tiene una para el Nombre del Servidor. El procedimiento es similar para HTTPS en el puerto 443, edite el /etc/apache2/sitesavailable/ssl con el siguiente comando: # vim /etc/apache2/sites- available/ssl Nota: Observe lo siguiente que debes cambiar o agregar en la configuracin de los Virtual Host.
NameVirtualHost *:443 <VirtualHost *:443> ServerName localhost DocumentRoot /var/www-ssl/html

Nota: Use su IP asignada o el nombre DNS seguido con ":443" .Si usted tiene una para el Nombre del Servidor.

9/20

Indicar al Apache para escuchar al puerto 443: Usted debe editar el archivo /etc/apache2/ports.conf con el siguiente comando:

# vim /etc/apache2/ports.conf y aadir la siguiente linea:


Listen 443

Modificar el fichero /etc/hosts (si es necesario): Cuando arranque y detenga el servidor Apache, all tal ves exista una advertencia como "Could not determine the server's fully qualified domain name, using 127.0.1.1 for ServerName". Debe tomar en cuenta esto si no tiene un nombre DNS para su servidor y esta usando una IP dinmico. Si este es su caso dirjase dentro del archivo /etc/hosts y realice los cambios siguientes: Bsicamente usted debe agregar localhost.localdomain a la IP de 127.0.0.1 y cualquier nombre de su sistema que seleccion cuando instal su distribucin (que asume usted no lo ha cambiado). La lnea final abajo debe estar all si tienes un IP esttico y el correspondiente nombre del DNS registrado para esto. Si ste es el caso, en el paso anterior llamado Configurar los virtual hosts donde se coloc el ServerName, all debe tener un valor que corresponda con el nombre del DNS, tambin indicado aqu y lo puede realizar con el siguiente comando:

# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain {su nombre de su pc} 127.0.1.1 {su nombre de su pc} {IP esttica, si usted tienes uno} {Completo nombre del host DNS, si usted tiene uno}

Instalar GPGV: Se necesita instalar el verificador de firmas GPG que permitir a la aplicacin a desarrollar que pueda firmar y enviar los datos, usted lo puede realizar con el siguiente comando:

# aptitude install gpgv

Iniciar sesin con usuario Apache: Si usted ha seguido los pasos previos debera estar iniciado como usuario root, si es as debe iniciar sesin desde la consola como el usuario www-data que es el usuario que usa el servidor Apache para la ejecucin de solicitudes de los diferentes clientes hacia el servidor, usted lo puede realizar con el siguiente comando:

10/20

# su www-data

Generar llave(s) PGP: Se deben generar un nuevo par de llaves como un usuario sin privilegios de root, para que posteriormente pueda leer las claves del cliente de correo de su preferencia, usted lo puede realizar con el siguiente comando:

$ gpg gen-key Nota: Observa que el User Id o UID que colocas al generar la firma PGP lo debe cambiar o agregar en el archivo mail.php que vers en la seccin Mi solucin al problema en la variable llamada $desde, para que el interprete de PHP puede ejecutar el comando para firmar el mensaje que se enva cifrado con la firma que en este paso se esta generando.

Listar de llave(s) pblica(s) PGP: Lista todas las llaves desde el anillo de claves pblicas, o justo las obtenidas en la linea de comando, lo puede realizar con el siguiente comando:

$ gpg --list-keys

Listar de llave(s) privada(s) PGP: Lista todas las llaves desde el anillo de claves privadas, o justo las obtenidas en la linea de comando, y usted lo puede realizar con el siguiente comando:

$ gpg --list-secret-keys

Exportar llave(s) pblica(s) PGP: Con la opcin --export se exporta todas las llaves desde todos los anillos de llaves. El nuevo anillo de llaves es escrito en la salida estndar o en un archivo dando la opcin --output. Use junto con la opcin --armor para los email de esas llaves y usted lo puede realizar con el siguiente comando:

$ gpg --armor --output /tmp/tsl_publicas.asc --export nombre@proveedor Nota: Observa que el e-mail nombre@proveedor es el mismo que coloco al generar la llaves PGP que realiz anteriormente en el paso llamado Generar llaves PGP.

Exportar llave(s) privada(s) GPG: La opcin --export-secret-key es casi igual como la opcin --export, pero exporta las llaves secretas, usted lo puede realizar con el siguiente comando:

11/20

$ gpg --armor --output /tmp/tsl_privadas.asc --export-secret-key nombre@proveedor Nota: Observa que el e-mail nombre@proveedor es el mismo que coloco al generar la llaves PGP que realizo anteriormente en el paso llamado Generar llaves PGP.

Cerrar sesin del usuario www-data: Se debe cerrar la sesin del usuario www-data y usted lo puede realizar con el siguiente comando:

$ exit

Instalar PHP5: Se necesita instalar el intrprete de PHP5 con el respectivo mdulo para el servidor Apache 2 y usted lo puede realizar con el siguiente comando:

# aptitude install php5 libapache2- mod- php5

Reiniciar Apache: Se necesita reiniciar el servicio del servidor Apache2 para que vuelve a leer sus archivos de configuracin y reabre algn archivos de registros o logs y usted lo puede realizar con el siguiente comando:

# /etc/init.d/apache2 restart

Escribir una aplicacin de prueba: Cree un archivo llamado info.php en el directorio /var/www-ssl/html para comprobar la instalacin del mdulo de PHP en Apache y usted lo puede realizar con el siguiente comando:

# vim /var/www- ssl/html/info.php A continuacin escriba el siguiente cdigo:


<?php phpinfo(); ?>

Ejecute su navegador preferido para probar nuestros servicios con la siguiente URL: https://localhost/info.php si muestra la informacin de la configuracin de PHP5, podemos pasar al desarrollo de la aplicacin para el proyecto. Si descarga el fichero info.php es que no esta configurado correctamente el modulo PHP5 con el servidor Apache 2, verifique que all realizado exitosamente el paso llamado Instalar PHP5.

12/20

Desarrollo de la aplicacin demostrativa


El enunciado propuesto para el Proyecto de Software Libre del I Triatlon Regional de Software Libre Mrida es el siguiente: 1. Realizar una aplicacin web segura que envi por un formulario los siguientes datos: 1. 2. 3. 4. Nombre Cdula Direccin Telfono.

La misma debe enviar los datos firmados mediante GPG al correo nux@ula.ve puede usar cualquiera de los recursos a continuacin: PKI, GPG, Web service, CGI, entre otros.

Mi solucin al problema
Bueno aqu va mi solucin al problema la cual solvente usando el siguiente modelo:

Cuadro 1: Ilustracin del proceso de flujo de trabajo de la aplicacin

Obtener los fuentes del proyecto Usted puede obtenerlo desde el siguiente vinculo: www-ssl.tar.gz

13/20

Tambin

en la secciones llamadas Fichero index.html y Fichero mail.php se encuentran detallados los cdigo de la aplicacin.
Fichero index.html
El fichero llamado index.html que posee el formulario de datos, donde los mismo son enviados a la aplicacin llamada mail.php.
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Prototipo de Triatlon de Software Libre</title> <meta name="GENERATOR" content="Quanta Plus" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="KEYWORDS" content="triatlon de software libre, software libre, ofimtica, programacin. administracin gnu linux" /> <link rel="stylesheet" type="text/css" href="styles/.css" /> </head> <body style="background-color : #c08300;"> <h1 style="color : #ffffff;">Formulario de contacto</h1> <form action="mail.php" method="post" enctype="multipart/form-data"> <fieldset title="Ingrese sus datos en el siguiente formulario de contacto" style="background-color : #c0b53c; width : 20%px;"> <legend accesskey="Prueba" style="color : #ffffff;">&#160;<strong><em>Formulario de contacto</em></strong>&#160;</legend><br /> <strong>Nombre completo:</strong> &#160;<input type="text" name="nombre" size="50" maxlength="25" alt="Ingrese por favor su nombre completo" tabindex="1" /><br /><br /> <strong>C&#233;dula de identidad:</strong> &#160;<input type="text" name="cedula" size="10" maxlength="12" alt="Ingrese por favor su n&#250;mero de cdula de identidad" tabindex="2" /><br /> <br /> <strong>Direcci&#243;n:</strong> &#160; <input type="text" name="direccion" size="60" maxlength="100" alt="Ingrese por favor su direcci&#243;n de domicilio completa" tabindex="3" /><br /><br /> <strong>Tel&#233;fono:</strong> &#160;<input type="text" name="telefono" size="25" maxlength="25" alt="Ingrese por favor su tel&#233;fono" tabindex="4" /><br /><br /> <input type="submit" name="enviar" value="Enviar" alt="Haga clic aqu&amp;iacute; para enviar los datos" /> <input type="reset" name="limpiar" value="Limpiar formulario" alt="Haga clic aqu&amp;iacute; limpiar los datos del formulario" /> </fieldset><br /><br /> </form> </body> </html>

14/20

Fichero mail.php
Este fichero recibe los datos, se construye el mensaje y se firma con GPG del emisario antes de enviarlo al destinatario.
<?php $nombre = $_POST['nombre']; $cedula = $_POST['cedula']; $direccion = $_POST['direccion']; $telefono = $_POST['telefono']; // ruta del GPG $gpg = '/usr/bin/gpg';

// // // //

Datos de origen Es el nombre del usuario que enva el correo pero tambin debe ser el mismo user id o UID del que firma el mensaje con su clave gpg

$desde = 'Leonardo'; // Datos de destinatario // E-mail del destinatario // $para = 'nux@ula.ve'; $para = 'leonardo@localhost'; // asunto $asunto = 'Correo del Mini Proyecto de Leonardo Caballero'; // mensaje $mensaje = " <?xml version=\"1.0\" encoding=\"utf-8\"?> <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"> <html xmlns=\"http://www.w3.org/1999/xhtml\"> <head> <title>$asunto</title> <meta name=\"GENERATOR\" content=\"Quanta Plus\" /> <meta name=\"AUTHOR\" content=\"Leonardo Caballero\" /> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /> <meta name=\"KEYWORDS\" content=\"triatlon de software libre\" /> </head> <body> <table width=\"100%\" cellspacing=\"2\" border=\"1\" cellpadding=\"2\">

15/20

<caption>Datos enviados por un usuario</caption> <thead> <tr align=\"center\"> <th>Nombre</th> <th>C&#233;dula</th> <th>Direcci&#243;n</th> <th>Tel&#233;fono</th> </tr> </thead> <tfoot> <tr> <td colspan=\"4\" align=\"center\">Espero su respuesta</td> </tr> </tfoot> <tbody align=\"justify\" valign=\"middle\"> <tr> <td>$nombre</td> <td>$cedula</td> <td>$direccion</td> <td>$telefono</td> </tr> </tbody> </table> </body> </html> "; // Para enviar correo HTML, la cabecera Content-type debe definirse $cabeceras = 'MIME-Version: 1.0' . "\r\n"; $cabeceras .= 'Content-type: text/html; charset=utf-8' . "\r\n"; // Este es un comando de Shell que imprime la variable $mensaje y // se las enva al programa gpg que firmara el mensaje con el // parmetro -e encripta la data, con el parmetro --always-trust // es idntica a la --trust-model always evita la validacin de // clave y asume que la clave usada es siempre muy confiable y con el // parmetro -r encripta por el nombre del user id o uid. $comando = "echo \"$mensaje\" | $gpg -e --always-trust -r $desde"; // Enviarlo $mensaje_encriptado = base64_encode(shell_exec($comando)); $correo = mail($para, $asunto, $mensaje_encriptado, $cabeceras); if ($correo) { echo "\n<h1>El correo fue enviado exitosamente.</h1>\n"; echo $mensaje; $mensajejs = "<script>\n"; $mensajejs.= " alert('El correo fue enviado exitosamente');\n";

16/20

$mensajejs.= " location.href='index.html';\n"; $mensajejs.= "</script>\n"; echo $mensajejs; } else { echo "\n<br /><h1>No ha podido enviar el correo.</h1><br />\n"; } ?>

Despliegue la aplicacin
El cdigo fuente de la aplicacin se debe desplegar en el siguiente directorio: /var/wwwssl/htmls/ , usted lo puede realizar con los siguientes comandos: # cp /RUTA-ABSOLUTA/index.html /var/www/www- ssl/ # cp /RUTA-ABSOLUTA/*.php /var/www/www- ssl/ Donde: RUTA-ABSOLUTA: Es la ruta absoluta del directorio donde se encuentran los ficheros de la aplicacin.

Ejecutar la aplicacin
Ejecute su navegador preferido para probar los servicios con la siguiente URL: https://127.0.0.1:443/index.html , le deber mostrar el Formulario de contacto, donde debe agregar los datos y presionar el botn de Enviar para que proceda a enviar los datos.

Verificar la recepcin y decodificacin del mensaje enviado Instalar llave(s) privada(s) PGP en el usuario destino: Se debe iniciar la sesin del usuario destino, luego importar la(s) llave(s) privada(s) PGP y lo puede realizar con el siguiente comando:

# su USER Donde: USER: Es el nombre del usuario del destinatario. $ gpg --import /RUTA-ABSOLUTA/tsl_privadas.asc Donde:

17/20

RUTA-ABSOLUTA: Es la ruta absoluta del directorio donde se encuentra la clave privada exportada previamente, para que el usuario del destinatario pueda descifrar el correo.

Configurar el cliente de correo: Para este caso lo demostrare usando el cliente de correo Evolution de GNOME, las razones las cito a continuacin:

Ya esta instalado por defecto en el sistema de ventana GNOME. La configuracin de la cuenta de correo con respecto a la UID de la llave PGP es casi transparente.

Simplemente configure una cuenta de correo del destinatario que se defini en la variable $para. La idea es poder descifrar desde el cliente de Evolution el e-mail enviado desde la aplicacin realizada. Al abrir el e-mail enviado desde la aplicacin, el cliente Evolution comparara el ID del email con lo(s) UID de la(s) llave(s) local(es) previamente instalada(s), si existe coincidencia y le pedir que ingrese la clave de la llave privada PGP, as de esa forma descifrar el e-mail que se envi cifrado.

Conclusiones
Espero que les sirva este HowTo para instalar, configurar y desplegar los servicios esta aplicacin bsica que implementa este tipo de funcionalidad. Para mi fue muy interesante lograr este proyecto, lastima que al momento de presentarlo fall en la configuracin del cliente de correo (tena tiempo que no lo haca) y adems las llaves PGP no las importe adecuadamente en el usuario donde se ejecutaba el cliente Evolution, por consiguiente no pude descifrarlo desde el cliente, :( pero si demostr por consola que se estaba enviado el e-mail cifrado :P

Obtener una copia de este documento


Usted puede obtenerlo desde el siguiente vinculo: servidor-web-seguro-apacheopenssl-gpg-php5.pdf

Agradecimientos
A Dios por la sabidura dada, al CPTM por la oportunidad de participar en el evento, a Dueas J. por su trabajo llamado Cmo configurar Apache con soporte SSL/TLS de Linux para todos el

18/20

cual me sirvi de mucho ;), tambin a todo el personal de Fundacite Mrida especialmente a Hector Lira, Hector Colina e Igor Muoz que me apoyaron y supieron responder de forma oportuna a las dudas que les formule, a Syra Lacruz por su colaboracin, sobre todo durante esos das me apoyo mucho :P

Licenciamiento
Copyright 2007, 2008 Leonardo Caballero. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".

GNU Free Documentation License


Puede obtener una copia de la licencia "GNU Free Documentation License" en los siguientes sitios en Internet:

http://www.gnu.org/copyleft/fdl.html http://www.fsf.org/licensing/licenses/fdl.html

Referencia
[Dueas 2007] Dueas J. (2007): Cmo configurar Apache con soporte SSL/TLS. Linux para todos. En linea: http://www.linuxparatodos.net/portal/staticpages/index.php?page=como-apache-ssl. ltimo acceso: 13/09/2007. [CEM-bot 2007] CEM-bot, (2007): HTTPS. Wikipedia Espaol. En linea: http://es.wikipedia.org/wiki/HTTPS. ltimo acceso: 03/01/2008. [Netscape 2007] Netscape, (2007): SSL 3. Netscape. En linea: http://wp.netscape.com/eng/ssl3/draft302.txt. ltimo acceso: 13/09/2007. [LordT 2007] LordT, (2007): RSA. Wikipedia Espaol. En linea: http://es.wikipedia.org/wiki/RSA. ltimo acceso: 03/01/2008.

19/20

[TXiKiBoT 2007] TXiKiBoT, (2007): Triple DES. Wikipedia Espaol. En linea: http://es.wikipedia.org/wiki/Triple_DES. ltimo acceso: 03/01/2008. [Ignacioerrico 2007] Ignacioerrico, (2007): X.509. Wikipedia Espaol. En linea: http://es.wikipedia.org/wiki/X.509. ltimo acceso: 03/01/2008. [OpenSSL 2007] OpenSSL, (2007): OpenSSL. OpenSSL. En linea: http://www.openssl.org/. ltimo acceso: 13/09/2007. [Apache 2007] Apache F., (2007): Apache Mod SSL. Apache Foundation. En linea: http://httpd.apache.org/docs/2.2/mod/mod_ssl.html. ltimo acceso: 13/09/2007. [Nolaiz 2007] Nolaiz, (2007): PGP. Wikipedia Espaol. En linea: http://es.wikipedia.org/wiki/PGP. ltimo acceso: 03/01/2008. [RobotQuistnix 2007] RobotQuistnix, (2007): Gpg. Wikipedia Espaol. En linea: http://es.wikipedia.org/wiki/Gpg. ltimo acceso: 03/01/2008. [VolkovBot 2007] VolkovBot, (2007): Servidor HTTP Apache. Wikipedia Espaol. En linea: http://es.wikipedia.org/wiki/Servidor_HTTP_Apache. ltimo acceso: 03/01/2008. [Jarisleif 2007] Jarisleif, (2007): PHP. Wikipedia Espaol. En linea: http://es.wikipedia.org/wiki/PHP. ltimo acceso: 03/01/2008. [CienciaAlPoder 2007] CienciaAlPoder, (2007): HTML. Wikipedia Espaol. En linea: http://es.wikipedia.org/wiki/HTML. ltimo acceso: 03/01/2008. [CienciaAlPoder 2007] CienciaAlPoder, (2007): CSS. Wikipedia Espaol. En linea: http://es.wikipedia.org/wiki/Hojas_de_estilo_en_cascada. ltimo acceso: 03/01/2008. [AlleborgoBot 2007] AlleborgoBot, (2007): Cliente de correo electrnico. Wikipedia Espaol. En linea: http://es.wikipedia.org/wiki/Cliente_de_correo_electrnico. ltimo acceso: 03/01/2008. [Estirabot 2007] Estirabot, (2007): Novell Evolution. Wikipedia Espaol. En linea: http://es.ikipedia.org/wiki/Novell_Evolution. ltimo acceso: 03/01/2008.

20/20

Potrebbero piacerti anche