Documente Academic
Documente Profesional
Documente Cultură
SENA 2009
Las nuevas Tecnologías de la Información han tomado las redes como eje para el desarrollo de
diferentes sistemas de interacción, en los que la transmisión de información se convierte en una de
las principales preocupaciones, pues esta es la fuente y el sustento de los procesos que aquí se
manejan. La web posiblemente como la red mundial mas grande de transmision de datos no se
escapa de gran variedad de ataques que pretenden vulnerar cualquiera de los principios de la
informacion, Confidencialidad, Integridad, Disponibilidad y No repudio, por esto, personas y
comunidades interesadas en mejorar la seguridad en las comunicaiones han desarrollo una serie de
herramientas que pretenden generar confianza en el momento del intercambio de datos.
SSL y TLS son dos protocolos creados con la finalidad de añadir a las capas de aplicación y
tranporte del modelo OSI una serie de componetes capaces de cifrar los paquetes que en nuestro
caso se enviaran desde los clientes hacia servidores web y viceversa, permitiendo que el
intercambio de datos este encriptado bajo algoritmos RSA (Clave pública / Clave privada). En el
caso de los servidores web, estos deberan poseer un certificado aprobado por un tercero confiable
que indicara al cliente (navegador web) su identidad y quien la corrobora, por su parte el navegador
debe soportar la notificación de comprobación de identidad del servidor al cual se conecta y
responder con sus credenciales si el servidor asi lo requiere.
A continuación mostraremos como generar certicados digitales y como crear la entidad que los
firmara, otorgando confianza “local” puesto que para esto se han creado entidades externas
encargadas de hacerlo, lo que trataremos en este documento sera la implementación de un servidor
web trabajando con los protocolos seguros SSL, crear la Autoridad Certificadora propia,
basicamente la implemetación de la Infraestructura de Llave Pública.
Los navegadores web reconocen, por defecto, una serie de autoridades certificadoras como Verisign
o Thawte, aunque hay muchas más. Puedes verlas todas en las opciones de tu navegador. Pero, ¿qué
es realmente lo que hace una Autoridad Certificadora? Firmar. Firma tu certificado SSL asegurando
que os pertenece a ti y a tu dominio. Cuando un cliente accede a tu dominio y descarga el
certificado SSL, busca dentro de sus certificados de CA’s si hay alguno que lo haya firmado. Si lo
encuentra, acepta tu certificado y no ocurre nada especial, pero si no encuentra la CA lanza un aviso
indicando que no se reconoce la autoridad que lo firma. Esto no quiere decir que el certificado no
sea válido, lo único que ocurre es que no sabe quien lo firma. Esto significa, por tanto, que tú
mismo puedes ser tu propia autoridad certificadora y firmar tus certificados, funcionarán
perfectamente y cumplirán su cometido de asegurar las comunicaciones cliente/servidor.
1- Comenzamos creando el servidor DNS que nos permitira hacer las pruebas locales necesarias.
Luego de iniciar sesión como super usuario instalamos el paquete necesario para el servidor
Ingresamos a editar el archivo de los registros de la zona directa, asegurandonos de especificar las
variables y nombres adecuados, pues son estos los que permitiran encontrar el equipo en la red.
debian:/etc/bind# nano directa
Acto seguido modificamos el archivo con los registros de la zona inversa y lo dejamos similar a las
lineas de la siguiente imagen
debian:/etc/bind# nano inversa
Para evitar poner IP fija y poder tener salida a internet y la vez tener nuestros sitios y registros DNS
corriendo, habilitamos la opción de reenvio que ofrece el bind, primero copiamos la IP del DNS
actual de la red que se puede ver en: /etc/resolv.conf
La llevamos al archivo que habilita la opción de reenvio en el bind en
/etc/bind/named.conf.option y tras descomentar las lineas de reenvio (forwarder) el
archivo debera lucir como la siguiente imagen
Reiniciamos el servidor para que cargue los cambios realizados y verificamos que este libre de
errores de configuración
Por ultimo probamos que las zonas y los registros agregados esten respondiendo correctamente a las
configuraciones y datos agregados, lo hacemos desde cualquier ruta del sistema con el comando
nslookup, podemos ver como es resuelto tanto los registros internos agregados manualmene
como los externos como google.com resuelto por terceros gracias al reenviador
2- El segundo componete necesario para esta implementación será un revidor web, que instalaremos
normalamente pero a quien en pasos siguientes se modificara para establecer la conexión segura.
Comenzamos instalando el paquete servidor de los repositorios, con aptget install apache2
Como primera medida para instalar un servidor web debemos tener previamente seleccionados los
archivos que queremos publicar en el servidor, procedemos entonces a ubicarlos en la ruta que
posteriormente sera indicada en los archivos de configuración del servidor web, crearemos una
carpeta en la que se almacenaran los archivos del sitio
######### /etc/apache2/sitesavailable/default Modificado ##############
<VirtualHost *:80>
Servername www.alejo.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/buscador/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/buscador/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
DirectoryIndex Buscar_com_ve.html
</Directory>
ScriptAlias /cgibin/ /usr/lib/cgibin/
<Directory "/usr/lib/cgibin">
AllowOverride None
Options +ExecCGI MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/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
</Directory>
</VirtualHost>
################### default Modificado ####################
Solo queda reiniciar el servidor para que cargue los cambios, informe sobre posibles problemas que
se deben corregir de inmediato y verificar que todo este correcto
Ahora desde el navegado web accedemos al sitio para verificar que el sitio se encuentre corriendo y
cargando todos sus archivos correctamente, recordemos que podemos hacerlo con la URL dada en
el registro dns o la IP local renombrada en /etc/hosts
ó ingresando con la IP debe cargar el mismo sitio
3- Instalamos el servidor ssl, que con sus paquetes permitira la implementación de la entidad
certificadora y las diferentes funciones como firmar certicados digitales, crear certicados para
clientes, validar la identidad mia y de otros, entre otros.
Es buena idea verificar la version del paquete descargado, para saber que soporta y en que
procedimientos puede usarse
Ahora iremos a los archivos de configuración del Openssh y comenzaremos creando el directorio
que albergara los archivos de la nueva entidad certificadora en /ect/CA
En ese nuevo directorio creamos dos carpetas, una contendran las claves de los certicados
generados y otra el certificado.
En este punto debemos editar el archivo de configuración de openssl, en el que se encuentran las
variables que ssl tomara para crear entidades certificadoras, crear certicados, firmarlos, entreo otras,
comenzamos copiando el archivo de configuración de openssl para mantener el backup de este.
Como anteriormente hemos vaciado el archivo, se recomienda utilizar las siguientes lineas con las
que según nuestras preferencias, obtendremos las variables que el servidor tomara para la ejecución
de las funciones de openssl, como creación y firma de certicados digitales
# www.linuxtotal.com.mx
# sergio.gonzalez.duran@gmail.com
#
# Archivo de configuracion para openssl
#
# ***** openssl.cnf ******
dir = . # variable que establece el directorio de trabajo
# seccion que permite convertirnos en una CA
# solo se hace referncia a otra sección CA_default
[ ca ]
default_ca = CA_default
[ CA_default ]
serial = $dir/serial # archivo que guarda el siguiente número de serie
database = $dir/index.txt # archvio que guarda la bd de certificados
new_certs_dir = $dir/certificados # dir que guarda los certificados generados
certificate = $dir/CAcertificado.pem # nombre del archivo del certificado raíz
private_key = $dir/privado/cakey.pem # llave privada del certificado raíz
default_md = md5 # algoritmo de dispersión usado
preserve = no # Indica si se preserva o no el orden de los
# campos del DN cuando se pasa a los certs.
nameopt = default_ca # esta opcion y la siguiente permiten mostrar
# detalles del certificado
certopt = default_ca
policy = policy_match # indica el nombre de la seccion
# donde se especifica que campos son
# obligatorios, opcionales y cuales deben ser
# iguales al certificado raíz
# seccion de politicas para la emision de certificados
[ policy_match ]
countryName = match # match, obligatorio
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional # optional, campo opcional
commonName = supplied # supplied, debe estar en la petición
emailAddress = optional
# seccion que indica como los certificados deben ser creados
[ req ]
default_bits = 1024 # tamaño de la llave, si no se indica 512
default_keyfile = key.pem # nombre de la llave privada
default_md = md5 # algoritmo de dispersión a utilizar
string_mask = nombstr # caracteres permitidos en la mascara de la llave
distinguished_name = req_distinguished_name # seccion para el nombre distinguido (DN)
req_extensions = v3_req # seccion con mas extensiones que se añaden a la
# peticion del certificado
# seccion del nombre distinguido, el valor es el prompt que se vera en pantalla.
# datos del propietario del certificado.
# esta seccion define el contenido de datos de id que el certificado llevara.
[ req_distinguished_name ]
0.organizationName = Nombre de la organizacion
0.organizationName_default = Alejo, S.A.
organizationalUnitName = Departamento o division
emailAddress = Correo electronico
emailAddress_max =
localityName = Ciudad o distrito
localityName_default = Medellin
stateOrProvinceName = Estado o provincia
stateOrProvinceName_default = Antioquia
countryName = Codigo del pais (dos letras)
countryName_default = CO
countryName_min = 2
countryName_max = 2
commonName = Nombre comun (hostname o IP)
commonName_max = 64
# si en la linea de comandos se indica la opcion x509,
# las siguientes extensiones tambien aplican
[ v3_ca ]
# indica que se trata de un certificado CA raíz con autoridad para
# firmar o revocar otros certificados
basicConstraints = CA:TRUE
# especifica bajo que metodo identificar a la llave publica que sera certificada
subjectKeyIdentifier = hash
# especifica como identifcar la llave publica
authorityKeyIdentifier = keyid:always,issuer:always
# extensiones de la opcion req
[ v3_req ]
basicConstraints = CA:FALSE # los certificados firmados no son CA
subjectKeyIdentifier = hash
#
Al copiar estas lineas en /etc/ssl/openssl.cnf con la utilidad gedit, deberemos ver algo así.
Al volver a la consola original y ver o modificar los campos para nuestra configuración unica,
debemos prestar especial atención a las lineas que se muestran a continuación, pues indican la
informacion requerida en los certicados.
Antes de proceder a ejecutar las funciones propias de una entidad certicadora, verificamos que los
archivos y directorios necesarios se encuntren en la ruta adecuada, en este caso. /etc/ssl/CA/
4- Al completar los requisitos anteriores crearemos el certicado que avalara la identidad de una
entidad certificadora, que nos permitira a su vez la creacion y firma de certificados, para las
conexiones seguras.
El anterior comando activa el asistente para petición de certificados y con la siguiente cadena lo
generamos
> out CAcertificado.pem days 3650 config ./openssl.cnf
el comando “openssl” invocado anteriormente esta acompañado de las siguintes opciones
El asistente de peticion de certificados ira tomando los datos necesarios para avalar la petición
como la empresa, el pais, etc.
Ahora podemos ver el certificado de la nueva entidad certicadora que la identificara ante los
usuarios que a ella hagan peticiones, debian:/etc/ssl/CA# more Cacertificado.pem
Y la clave generada al pedir el certificado. debian:/etc/ssl/CA# more privado/cakey.pem
5- Como ya tenemos una entidad certicadora que firmara y avalara la identidad de sitios web que
confien en ella, procedemos a generar la petición del certificado para el sitio web en el que hemos
trabajado (www.alejo.com) con el siguiente comando, donde indicamos:
*req =solicitando un certificado nuevo.
*-out =nombre del certificado que deseamos que nos firmen.
*-config =toma el archivo de configuración que creamos.
*-nodes =indica que no deseamos contraseña en la llave privada. .
debian:/etc/ssl/CA# openssl req nem nodes out alejocert.pem config ./openssl.cnf
Ingresamos los datos que el asistente de generación de certicados requiere, podemos dejar los que
trae por omisión, o modificarlos según nuestra preferencia, (el “nombre comun” sera el que indique
el propietario del certificado, por lo que este debe ser valido según nuestra configuración.)
Hemos generado una petición de certificado “alejo-cert.pem” y una llave privada “key.pem” con la
que se encriptara la comunicación que bajo este certificado se establezca, observamos la peticion.
Nos pedira la clave de la entidad certificadora, nos confirmara los datos del certificado y nos
preguntara si deseamos firmar esta peticion.
6- El servidor necesitara habilitar ahora su autenticación, indicando que la conexión hacia él se hara
de forma segura, además debe especificarse en sus archivos de configuración la ruta del certificado
que utilizara y las redirecciones respectivas a puertos seguros, esto se hace principalmente en el
archivo del sitio web, donde se agregara un <virtual host> al final del archivo, la variable de
“RedirectPermanent” y las variables de SSL que habilitaran e indicaran el metodo de autenticación.
<VirtualHost *:80>
ServerName www.alejo.com
ServerAdmin webmaster@localhost
RedirectPermanent / https://www.alejo.com
DocumentRoot /var/www/buscador/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/buscador/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
DirectoryIndex Buscar_com_ve.html
</Directory>
ScriptAlias /cgibin/ /usr/lib/cgibin/
<Directory "/usr/lib/cgibin">
AllowOverride None
Options +ExecCGI MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/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
</Directory>
</VirtualHost>
<VirtualHost *:443>
ServerName www.alejo.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/buscador/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/buscador/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
DirectoryIndex Buscar_com_ve.html
</Directory>
SSlEngine on
SSLCertificateFile /etc/ssl/CA/firmadoalejo.com
SSLCertificateKeyFile /etc/ssl/CA/key.pem
</VirtualHost>
*Modificaremos el host virtual para que nos direccione de http:// a https:// donde nos indica que el
sitio es seguro y utiliza ssl.
*Agregamos la variable RedirectPermanent / https://www.alejo.com para que todas las peticiones
que el usuario haga por el puerto 80 las envié al puerto seguro 443.
*Agregamos las variables que indicaran la interacción con SSL.
“SSLEngine on” es para encender el motor de SSL.
“SSLcertificateFile” ruta donde se almacena nuestro certificado firmado. (/etc/ssl/CA/firmado-
alejo.com).
“SSLCertificateKeyFile”ruta donde se almacena la llave privada.
(/etc/ssl/CA/key.pem).
Para habilitar la comunicación por el puerto seguro debemos indicarle al archivo referente que lo
haga por el puerto 443 para las comunicaciones seguras en los servidores web.
7- Por ultimo habilitamos el módulo de seguridad para apache2 con el comando que carga los
modulos debian:/etc/apache2# a2enmod ssl
Terminamos reiniciando apache para que tome los ultimos cambios realizados en sus archivos y
luego de corregir posibles errores de rutas y variables procedemos a probarlo
Ahora necesitamos verificar que todo lo realizado anteriormente se a incorporado al servivio de una
forma exitosa, primero nos dirigimos al navegador web y digitamos la url del sitio que hemos
trabajado anteriormente “http://www.alejo.com”
Debera emitir una notificación de error al comunicarse pues este sitio debe verse utilizando un
certificado válido con el cual no contamos, entonces damos clik en el enalce “Or you can add...”
para permitir la instalar el nuevo certificado y proceder a el inicio en el servidor.
Nos mostrara la opción de añadir el certificado “Add exeption...” y al aceptarla se desplegara un
asistente que permitira obtener dicho certificado
Podemos ver el certificado antes de instalarlo para comprobar los datos genrales de este.
Y al aceptar la conexión con este metodo de autenticación nos direccionara automaticamente al sitio
web seguro que hemos configurado a lo largo de este documento, indicando de este modo de
conexión por que en la barra de navegación en ves de aparecer “http://” ahora sale “https://” y por el
candado de la parte inferior del navegador.