miércoles, 19 de mayo de 2010

Instalar ssl en apache2 en debian lenny

Instalar ssl en apache2 en debian lenny
https : puerto 443


En esta oportunidad voya explicar de una manera basica como configurar el protocolo SSL para que trabaje con el servidor web apache2.

Que es el protocolo SSL:

Es un protocolo criptográfico que proporciona comunicaciones seguras por una red, comúnmente Internet.

SSL proporciona autenticación y privacidad de la información entre extremos sobre Internet mediante el uso de criptografía. Habitualmente, sólo el servidor es autenticado (es decir, se garantiza su identidad) mientras que el cliente se mantiene sin autenticar; la autenticación mutua requiere un despliegue de infraestructura de claves públicas (o PKI) para los clientes. Los protocolos permiten a las aplicaciones cliente-servidor comunicarse de una forma diseñada para prevenir escuchas (eavesdropping), la falsificación de la identidad del remitente (phishing) y alterar la integridad del mensaje.


SSL se ejecuta en una capa entre los protocolos de aplicación como HTTP, SMTP, NNTP y sobre el protocolo de transporte TCP, que forma parte de la familia de protocolos TCP/IP. Aunque pueda proporcionar seguridad a cualquier protocolo que use conexiones de confianza (tal como TCP), se usa en la mayoría de los casos junto a HTTP para formar HTTPS. HTTPS es usado para asegurar páginas World Wide Web para aplicaciones de comercio electrónico, utilizando certificados de clave pública para verificar la identidad de los extremos.

Bueno basicamente es implementar una configuracion cifrada entre nosotros y nuestro servidor. Asi cuando una persona malintencionada escucha nuestra conexion se puede evitar que se capturen datos en formato plano. Con ssl los datos estaran cifrado y mas seguros.

Que es openssl?

El proyecto OpenSSL es un esfuerzo colaborativo para desarrollar un kit de heraamientas ( robustas, de grado comercial, completamente funcional) que implementen los protocolos "Secure Sockets Layer" (SSL v2/v3) y "Transport Layer Security" (TLS v1) asi como una libreria criptografica potente y de proposito general. El proyetco es administrado por una comunidad de voluntarios que usan el en internet para comunicarse, planificar yd desarrollar el kit OpenSSL y su respectiva documentacion.

OpenSSL est basado en la excelente libreria SSLeay desarrollado por Eric A. Young y Tim J. Hudson. El kit OpenSSL esta licenciado bajo una licencia de tipo apache, que basicamete significa que uno es libre de conseguir y usar el kit para fines comerciales o no comerciales sujetos a algunas simples condiciones.


Que es apache:

Es un servidor web de codigo abierto al cual le vamos a configurar el protocolo SSL con la ayuda del kit OpenSSL para establecer comunicaciones seguras.

_____________________________________________________________________________________

Bien ya hemos puesto algo de teoria, que esta en abundancia por todo google. Ahora procedamos ala implementacion.


En este caso usaremos la distribucion Debian version estable (Lenny), debe ser lo mismo para Ubuntu y en caso de otras dsitros quizas cambien los comandos mas no la logica de la configuracion.

_____________________________________________________________________________________

INICIO:

Asumimos que ya tenemos instalado el servidor apache, si no esta instalado ejecutamos:

apt-get install apache2

Instalamos openssl + ssl-cert (que es un debconf para TCP Wrapers en debian)

apt-get install openssl ssl-cert


Generamos nuestro certificado :


openssl req $@ -newkey rsa:4096 -new -x509 -days 3650 -nodes -out ...
... /etc/apache2/apache.pem -keyout /etc/apache2/apache.pem


Nota: Aqui nos pregunatara nuestros datos, tener cuidado en ingresar los siguientes datos:
- Country:
PE ( para el caso de peru)
- Common Name:
localhost ( para el caso que estemos trabajando de manera local, si es para un server colocar el nombre de dominio, que tambien debe figurar en el fichero /etc/hosts)

Cambiamos permisos al certificado

chmod 600 /etc/apache2/apache.pem

Verificamos en el archivo /etc/apache2/ports.conf
que este la sentencia que permite a apahe escuchar en el puerto 443.
En mi caso ya estaba agregado por que estaba escrito dentro de una sentencia if. Si no esta activado debemos agregar la siguiente linea depues de la sentencia Listen 80. El archvio deberia quedar asi:

Listen 80
Listen 443

Bien luego procedemos a activar el modulo que permite el soporte ssl para nuestro servidor apache. Esto debido a que no todos los modulos estan activados y en este caso debemos activarlo. Ingresamos el siguiente comando:

a2enmod ssl


Forzamos que apache se recarge y ademas que se reinicie, ingresamos los siguientes comandos:

/etc/init.d/apache2 force-reload

/etc/init.d/apache2 restart

_________________________________________________________________________________________________

CONFIGURANDO NUESTROS HOSTS VIRTUALES
_________________________________________________________________________________________________

Bien luego de realizar los pasos anterioresm ahora procederemos a configurar nuestros virtual hosts dependiendo de cada host virtual alojado en nuestro servidor apache.

1.- Visualizamos el host virtual por defecto de apache (http://localhost). Abrimos el siguiente archivo: /etc/apache2/sites-available/default y observamos lo siguiente (los parametros importantes estan en rojo):

NameVirtualHost
*:80

menor VirtualHost *:80 mayor

     ServerAdmin admin@midominio.com
DocumentRoot /var/www/
ServerName localhost

Options FollowSymLinks
AllowOverride None

Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all

ErrorLog /var/log/apache2/error.log
LogLevel warn

CustomLog /var/log/apache2/access.log combined
ServerSignature On

Alias /doc/ "/usr/share/doc/"

Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128

menor slash VirtualHost mayor
Explicacion: Bien en este fichero observamos que el host por defecto esta diseñado para atender el dominio "localhost" y que trabaja con el protocolo http que atiende en el puerto 80.

Bien ahora crearemos un virtual host para que atienda el domnio "localhost" pero usando el protocolo seguro HTTPS que usa SSL y que atiende en el puerto 443

creamos el fichero
/etc/apache2/sites-available/ssl_default

(Nota: El servidor apache carga automaticamente todos los archivos que estan dentro de la carpeta "sites-available" en donde deben estar descritos nuestros host virtuales)

para ello creamos el fichero con el siguiente comando:

nano /etc/apache2/sites-available/ssl_default

y agregamos lo siguiente:

NameVirtualHost *:443

menor VirtualHost *:443 mayor

        ServerAdmin admin@midominio.com
DocumentRoot /var/www/
ServerName localhost

Options FollowSymLinks
AllowOverride None

Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all

ErrorLog /var/log/apache2/error.log
LogLevel warn

SSLEngine on
SSLCertificateFile /etc/apache2/apache.pem


CustomLog /var/log/apache2/access.log combined
ServerSignature On

Alias /doc/ "/usr/share/doc/"

Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128

menor slash VirtualHost mayor

Bien ahora que ya tenemos nuestro host virtual llamado ssl_default observamos que ahora los datos estan configurados para trabajar con SSL (Las sentencias importantes estan de color rojo)

NOTA IMPORTANTE:

Estas lineas son muy importantes, pero solo debes ir una sola vez para todos los hosts virtuales que usan un puerto especifico. (En otras distribuciones esta sentencia se colocal en el archivo principal , en el caso de debian se encuentra en los hosts virtuales)

NameVirtualHost *:80
NameVirtualHost *:443

Quiere decir que ya que nuestro servidor usa tanto el modo normal HTTP (80) y HTTPS (443), solo necesitamos las dos directivas anteriores, no se debe colocar doble vez ya que obtendremos errores. Por ejemplo, si tenemos 50 hosts virtuales en solo uno de ellos debemos especificra la directiva para el puerto 80. (NameVirtualHost *:80)

Bien para finalizar reiniciamos nuestro servidor apache y no debemos tener ningun error, lo hacemos con el siguiente comando:

/etc/init.d/apache2 restart


Solo nos queda la cereza del pastel y probamos que funcione :(
Vamos al navegador y chekeamos:

Para protocolo HTTP ingresamos: http://localhost

Para protocolo HTTPS ingresamos: https://localhost


Nota: En el caso de IExplorer y Epiphany nos sale mensajitos para aceptar el certificado,en el caso del Mozilla, sale que ha fallado la conexion, en ese caso le damos a la opcion "entiendo los riesgos", obtenemos el certificado y confirmamos la excepcion para ingresar a nuestra peticion
Reflexion:

Bien bueno solo agradecerles por chekear este pequeño articulo, es una instalacion basica pero que en algo ayudara a comprender el tem en mencion, por ultimo todo critica, correcion y aport es bienvenido, estamos para aprender y todo es bien recibido.

Saludos y hasta otra oportunidad.