ssl_linux
Transcript of ssl_linux
-
8/14/2019 ssl_linux
1/28
ALEJANDRO ARBOLEDASENA 2009
OPENSSL EN LINUX Autenticacion de un Servidor Web
Las nuevas Tecnologas de la Informacin han tomado las redes como eje para el desarrollo dediferentes sistemas de interaccin, en los que la transmisin de informacin se convierte en una de
las principales preocupaciones, pues esta es la fuente y el sustento de los procesos que aqu semanejan. 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 ycomunidades 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 aadir a las capas de aplicacin y
tranporte del modelo OSI una serie de componetes capaces de cifrar los paquetes que en nuestrocaso se enviaran desde los clientes hacia servidores web y viceversa, permitiendo que el
intercambio de datos este encriptado bajo algoritmos RSA (Clave pblica / Clave privada). En elcaso 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 notificacin de comprobacin de identidad del servidor al cual se conecta yresponder con sus credenciales si el servidor asi lo requiere.
A continuacin mostraremos como generar certicados digitales y como crear la entidad que losfirmara, otorgando confianza local puesto que para esto se han creado entidades externas
encargadas de hacerlo, lo que trataremos en este documento sera la implementacin de un servidorweb trabajando con los protocolos seguros SSL, crear la Autoridad Certificadora propia,
basicamente la implemetacin de la Infraestructura de Llave Pblica.
Los navegadores web reconocen, por defecto, una serie de autoridades certificadoras como Verisign
o Thawte, aunque hay muchas ms. Puedes verlas todas en las opciones de tu navegador. Pero, qu
es realmente lo que hace una Autoridad Certificadora? Firmar. Firma tu certificado SSL asegurandoque 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 CAs si hay alguno que lo haya firmado. Si loencuentra, 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 vlido, lo nico que ocurre es que no sabe quien lo firma. Esto significa, por tanto, que tmismo puedes ser tu propia autoridad certificadora y firmar tus certificados, funcionarn
perfectamente y cumplirn su cometido de asegurar las comunicaciones cliente/servidor.
http://www.verisign.es/http://www.thawte.com/http://www.verisign.es/http://www.thawte.com/ -
8/14/2019 ssl_linux
2/28
1- Comenzamos creando el servidor DNS que nos permitira hacer las pruebas locales necesarias.
Luego de iniciar sesin como super usuario instalamos el paquete necesario para el servidor
Entramos a modificar el archivo de configuracin de zonas del DNS en /etc/bind/named.conf
-
8/14/2019 ssl_linux
3/28
Ahora copiamos los archivos que almacenaran los registros con los que trabajara el DNS, debemos
copiar el formato para la zona inversa y directa redireccionando el contenido de los archivosdb.local y db.127
Ingresamos a editar el archivo de los registros de la zona directa, asegurandonos de especificar lasvariables y nombres adecuados, pues son estos los que permitiran encontrar el equipo en la red.debian:/etc/bind# nano directa
-
8/14/2019 ssl_linux
4/28
Acto seguido modificamos el archivo con los registros de la zona inversa y lo dejamos similar a las
lineas de la siguiente imagendebian:/etc/bind# nano inversa
Para evitar poner IP fija y poder tener salida a internet y la vez tener nuestros sitios y registros DNScorriendo, habilitamos la opcin de reenvio que ofrece el bind, primero copiamos la IP del DNS
actual de la red que se puede ver en: /etc/resolv.conf
-
8/14/2019 ssl_linux
5/28
La llevamos al archivo que habilita la opcin de reenvio en el bind en
/etc/bind/named.conf.option y tras descomentar las lineas de reenvio (forwarder) elarchivo debera lucir como la siguiente imagen
Editamos el archivo de resolv.conf que indica al sistema la direccion IP y el dominio
predeterminado y debera verse como el siguiente:debian:/home/debian# nano /etc/resolv.conf
-
8/14/2019 ssl_linux
6/28
El ultimo archivo que es necesario cambiar para la nueva y optima resolucion interna de nombres
sera /etc/hosts, donde indicaremos el nuevo nombre y la IP real a la que la maquina respondera alobtener peticiones desde la red.
Reiniciamos el servidor para que cargue los cambios realizados y verificamos que este libre de
errores de configuracin
-
8/14/2019 ssl_linux
7/28
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 manualmenecomo los externos como google.com resuelto por terceros gracias al reenviador
2- El segundo componete necesario para esta implementacin ser un revidor web, que instalaremos
normalamente pero a quien en pasos siguientes se modificara para establecer la conexin segura.Comenzamos instalando el paquete servidor de los repositorios, con apt-get install apache2
-
8/14/2019 ssl_linux
8/28
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 queposteriormente sera indicada en los archivos de configuracin del servidor web, crearemos una
carpeta en la que se almacenaran los archivos del sitio
Y a continuacin enviamos los ficheros correspondientes del futuro sitio
-
8/14/2019 ssl_linux
9/28
Entramos a modificar el archivo del nuevo sitio web, utilizaremos el default por asuntos
pedaggicos y prcticos (ud. puede copiar este y trabajar con los nuevos).
Ahora en el archivo especificaremos:-el encabezado de host, para tener la posibilidad de trabajar con URL's motivo por el cual se crearon
los registros DNS trabajar por IP, por lo cual se modifico /etc/hosts www.alejo.com
192.168.1.66-la ruta donde se guardaran los archivos del sitio web, index, imagenes y dems, usualmente
/var/www/ esta se muestra como DocumentRoot y Directory-el archivo que se indexara para mostrarse como primero al momento de visualizar la pagina desde
el navegador, esto se logra con la variable DirectoryIndex
Este archivo con las pocas modificaciones debera verse parecido a la imagen
http://www.alejo.com/http://www.alejo.com/http://www.alejo.com/ -
8/14/2019 ssl_linux
10/28
Cuelgo el archivo completo para despejar dudas sobre otras variables del mismo, aunque hasta el
momento no se han realizado mayores cambios
######### /etc/apache2/sites-available/default Modificado ##############
Servername www.alejo.comServerAdmin webmaster@localhost
DocumentRoot /var/www/buscador/
Options FollowSymLinksAllowOverride None
Options Indexes FollowSymLinks MultiViewsAllowOverride NoneOrder allow,denyallow from allDirectoryIndex Buscar_com_ve.html
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
AllowOverride NoneOptions +ExecCGI -MultiViews +SymLinksIfOwnerMatchOrder allow,deny
Allow from all
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/"
Options Indexes MultiViews FollowSymLinksAllowOverride NoneOrder deny,allowDeny from allAllow from 127.0.0.0/255.0.0.0 ::1/128
################### default Modificado ####################
-
8/14/2019 ssl_linux
11/28
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 ycargando todos sus archivos correctamente, recordemos que podemos hacerlo con la URL dada en
el registro dns o la IP local renombrada en /etc/hosts
-
8/14/2019 ssl_linux
12/28
ingresando con la IP debe cargar el mismo sitio
3- Instalamos el servidor ssl, que con sus paquetes permitira la implementacin 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.
-
8/14/2019 ssl_linux
13/28
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 configuracin del Openssh y comenzaremos creando el directorioque 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.
-
8/14/2019 ssl_linux
14/28
En este punto debemos editar el archivo de configuracin 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 configuracin de openssl para mantener el backup de este.
Borramos el contenido del archivo orginal y conservamos el backup.
Copiamos al directorio de la entidad certificadora el archivo de configuracin ssl que hemos
vaciado para posteriormente poblar con nuestra configuracin
-
8/14/2019 ssl_linux
15/28
Luego abrimos el archivo del openssl que estamos modificando, para tener una imagen clara y
manejo facil, lo hacemos con la utilidad gedit
Como anteriormente hemos vaciado el archivo, se recomienda utilizar las siguientes lineas con lasque segn nuestras preferencias, obtendremos las variables que el servidor tomara para la ejecucin
de las funciones de openssl, como creacin y firma de certicados digitales
# www.linuxtotal.com.mx# [email protected]## 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 seccin CA_default[ ca ]
default_ca = CA_default
[ CA_default ]serial = $dir/serial # archivo que guarda el siguiente nmero de seriedatabase = $dir/index.txt # archvio que guarda la bd de certificadosnew_certs_dir = $dir/certificados # dir que guarda los certificados generadoscertificate = $dir/CAcertificado.pem # nombre del archivo del certificado razprivate_key = $dir/privado/cakey.pem # llave privada del certificado razdefault_md = md5 # algoritmo de dispersin usadopreserve = 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 certificadocertopt = default_capolicy = policy_match # indica el nombre de la seccion
# donde se especifica que campos son# obligatorios, opcionales y cuales deben ser# iguales al certificado raz
-
8/14/2019 ssl_linux
16/28
# seccion de politicas para la emision de certificados[ policy_match ]countryName = match # match, obligatoriostateOrProvinceName = matchorganizationName = matchorganizationalUnitName = optional # optional, campo opcionalcommonName = supplied # supplied, debe estar en la peticinemailAddress = optional
# seccion que indica como los certificados deben ser creados[ req ]default_bits = 1024 # tamao de la llave, si no se indica 512default_keyfile = key.pem # nombre de la llave privadadefault_md = md5 # algoritmo de dispersin a utilizarstring_mask = nombstr # caracteres permitidos en la mascara de la llavedistinguished_name = req_distinguished_name # seccion para el nombre distinguido (DN)req_extensions = v3_req # seccion con mas extensiones que se aaden 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 organizacion0.organizationName_default = Alejo, S.A.organizationalUnitName = Departamento o divisionemailAddress = Correo electronicoemailAddress_max =localityName = Ciudad o distritolocalityName_default = MedellinstateOrProvinceName = Estado o provinciastateOrProvinceName_default = AntioquiacountryName = Codigo del pais (dos letras)countryName_default = COcountryName_min = 2countryName_max = 2commonName = 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 raz con autoridad para# firmar o revocar otros certificadosbasicConstraints = CA:TRUE
# especifica bajo que metodo identificar a la llave publica que sera certificadasubjectKeyIdentifier = 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 CAsubjectKeyIdentifier = hash#
-
8/14/2019 ssl_linux
17/28
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 configuracin unica,
debemos prestar especial atencin a las lineas que se muestran a continuacin, pues indican la
informacion requerida en los certicados.
-
8/14/2019 ssl_linux
18/28
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 unaentidad certificadora, que nos permitira a su vez la creacion y firma de certificados, para las
conexiones seguras.
El siguiente comando nos generara el certificado raz = CAcertificado.pem y Llave privada =
/etc/ssl/CA/privado/cakey.pem con la que la nueva entidad certicadora avalara su identidad y las
que en ella confien.debian:/etc/ssl/CA# openssl req -new -x509 -extensions v3_ca -keyout privado/cakey.pem \
El anterior comando activa el asistente para peticin de certificados y con la siguiente cadena lo
generamos
> -out CAcertificado.pem -days 3650 -config ./openssl.cnf
-
8/14/2019 ssl_linux
19/28
el comando openssl invocado anteriormente esta acompaado de las siguintes opciones
*req -new -x509 = sirve para crear un nuevo certificado autofirmado.
*-extensions v3_ca = sirve para crear el certificado raz CA (Entidad certificadora).
*-keyout = sirve para especificar el nombre y donde se guardara la llave privada.*-out = sirve para mostrar el nombre del certificado raz CA.
*-days 3650 = sirve para especificar el periodo de validez del certificado (3650 das=10aos). Si nose especifica el tiempo el certificado tendr una duracin de 30 das.
*-config = archivo de donde tomara la configuracin
El asistente de peticion de certificados ira tomando los datos necesarios para avalar la peticin
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
-
8/14/2019 ssl_linux
20/28
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 peticin 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 configuracin que creamos.*-nodes =indica que no deseamos contrasea en la llave privada. .
debian:/etc/ssl/CA# openssl req -nem -nodes -out alejo-cert.pem -config ./openssl.cnf
http://www.alejo.com/http://www.alejo.com/ -
8/14/2019 ssl_linux
21/28
Ingresamos los datos que el asistente de generacin de certicados requiere, podemos dejar los que
trae por omisin, o modificarlos segn nuestra preferencia, (el nombre comun sera el que indiqueel propietario del certificado, por lo que este debe ser valido segn nuestra configuracin.)
Hemos generado una peticin de certificado alejo-cert.pem y una llave privada key.pem con la
que se encriptara la comunicacin que bajo este certificado se establezca, observamos la peticion.
Y la llave de este certificado.
-
8/14/2019 ssl_linux
22/28
Para que la peticion generada anteriormente pase a ser certificado, necesitamos que la entidad lo
firme y exporte para ser agregado al sitio web solicitante.
Nos pedira la clave de la entidad certificadora, nos confirmara los datos del certificado y nospreguntara si deseamos firmar esta peticion.
Al firmarlo la peticion pasara a ser certificado con un formato como el siguiente
-
8/14/2019 ssl_linux
23/28
Los archivos de la entidad certificadora se actualizaran en el momento de la creacion de estos y
podemos verificarlo en el serial y en el idex.txt
6- El servidor necesitara habilitar ahora su autenticacin, indicando que la conexin hacia l se harade forma segura, adems debe especificarse en sus archivos de configuracin 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 al final del archivo, la variable deRedirectPermanent y las variables de SSL que habilitaran e indicaran el metodo de autenticacin.
ServerName www.alejo.comServerAdmin webmaster@localhostRedirectPermanent / https://www.alejo.comDocumentRoot /var/www/buscador/
Options FollowSymLinksAllowOverride None
Options Indexes FollowSymLinks MultiViewsAllowOverride NoneOrder allow,denyallow from allDirectoryIndex Buscar_com_ve.html
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
AllowOverride NoneOptions +ExecCGI -MultiViews +SymLinksIfOwnerMatchOrder allow,denyAllow from all
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
-
8/14/2019 ssl_linux
24/28
Alias /doc/ "/usr/share/doc/"
Options Indexes MultiViews FollowSymLinksAllowOverride NoneOrder deny,allowDeny from allAllow from 127.0.0.0/255.0.0.0 ::1/128
ServerName www.alejo.comServerAdmin webmaster@localhost
DocumentRoot /var/www/buscador/
Options FollowSymLinksAllowOverride None
Options Indexes FollowSymLinks MultiViewsAllowOverride NoneOrder allow,denyallow from allDirectoryIndex Buscar_com_ve.html
SSlEngine onSSLCertificateFile /etc/ssl/CA/firmado-alejo.comSSLCertificateKeyFile /etc/ssl/CA/key.pem
*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 peticionesque el usuario haga por el puerto 80 las envi al puerto seguro 443.
*Agregamos las variables que indicaran la interaccin 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).
SSLCertificateKeyFileruta donde se almacena la llave privada.(/etc/ssl/CA/key.pem).
Para habilitar la comunicacin por el puerto seguro debemos indicarle al archivo referente que lo
haga por el puerto 443 para las comunicaciones seguras en los servidores web.
https://www.alejo.com/https://www.alejo.com/ -
8/14/2019 ssl_linux
25/28
7- Por ultimo habilitamos el mdulo 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
-
8/14/2019 ssl_linux
26/28
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 hemostrabajado anteriormente http://www.alejo.com
Debera emitir una notificacin de error al comunicarse pues este sitio debe verse utilizando uncertificado vlido 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.
http://www.alejo.com/http://www.alejo.com/ -
8/14/2019 ssl_linux
27/28
Nos mostrara la opcin de aadir 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.
-
8/14/2019 ssl_linux
28/28
Y al aceptar la conexin con este metodo de autenticacin nos direccionara automaticamente al sitio
web seguro que hemos configurado a lo largo de este documento, indicando de este modo deconexin por que en la barra de navegacin en ves de aparecer http:// ahora sale https:// y por el
candado de la parte inferior del navegador.