7

Click here to load reader

CREAR CERTIFICADOS SSL PARA APACHE

  • Upload
    brontho

  • View
    201

  • Download
    4

Embed Size (px)

Citation preview

Page 1: CREAR CERTIFICADOS SSL PARA APACHE

CREAR CERTIFICADOS SSL PARA APACHECopyright 2005-2008 Sergio González DuránSe concede permiso para copiar, distribuir y/o modificar este documento siempre y cuando se cite al autor y la fuente de linuxtotal.com.mx y según los términos de la GNU Free Documentation License, Versión 1.2 ocualquiera posterior publicada por la Free Software Foundation.

autor: [email protected]

[ÍNDICE...]

Introducción

Imaginémonos a la empresa "Pato, S.A." que ofrece a sus empleados y c l ientes el sitio http://www.pato.com/consulta, donde mediante un nombre deusuario y contraseña es posible para los empleados consultar saldos, órdenes, resurti r, estados de cuenta, etc . y para los c l ientes observar el estado desus pedidos, su saldo, pagos, historial de compras, etc . El sitio esta perfec tamente diseñado, protegido contra inyecc iones sql, ataques mediante elurl, el servidor al día con los últimos parches y ac tualizac iones, toda entrada de usuario, contraseña, y demás debidamente validadas para solo rec ibircaracteres válidos y exc luir carac teres usados en consultas e instrucc iones sql, etc . etc . Una belleza en cuanto a la seguridad de la aplicac ión Web.PERO, todo el sitio func iona bajo un servidor Web apache en el puerto 80, esta bien, pero implica que un empleado rencoroso porque no leaumentaron el sueldo o no lo promovieron de puesto y con intenc iones de querer ser un hacker, instala un sniffer en su PC (dentro de la empresa),baja herramientas para envenenar mediante un ataque arp (arp poisoning) el switch al que corresponde a su segmento red de tal modo que puedeobservar todo el tráfico de red de los equipos conectados a su switch. Fác il, nada del otro mundo, cualquier chico de los scripts (script kiddie) lehubiera enseñado como hacerlo si no lo hubiese el sabido ya. En unas cuantas horas tiene ya varias cuentas de usuario y contraseñas, se introducecomo ellas y baja informac ión confidenc ial de varios de sus compañeros y como algunos son gerente, también obtiene informac ión sensible dec lientes. Listo, ahora a chantajear a la empresa por medio de un cómplice en el exterior o simplemente tratar de uti l izar la informac ión en subenefic io o peor aun causar algún tipo de destrozo con esta.

¿Ficc ión? Absolutamente no. Lo anterior es perfec tamente posible porque el tráfico de red generado entre el c l iente (navegador) y el servidor Webapache en el puerto 80 no esta encriptado, viaja tal cual. Entonces es posible, con la herramienta adecuada interceptar y observar este tráfico yobtener entre otras cosas contraseñas, números de tarjetas de crédito, etc . La soluc ión es simple (la implementac ión no tanto), obtener un certi ficadode seguridad y hacer que el tráfico se diri ja al puerto 443 (https) en vez del 80 (http). En el puerto 443 el tráfico se encripta a través del los protocolosSSL (Secure Sockets Layer) y TLS (Transport Layer Security). Entonces todo el tráfico será encriptado y aunque es posible interceptarlo y observarlo,no se verá mas que basura o cadenas de caracteres sin ningún significado todo el tiempo, logrando asi un canal seguro encriptado entre el c l iente yel servidor.

Certificate Authority CA (Autoridad Certificadora)

Esta fuera del alcance de este documento toda la teoría detrás de SSL, hay varios doc umentos, tutoriales y manuales en Internet que lo explican,pero lo que si hay que entender que es un CA. Una autoridad certi ficadora como lo son Verisign, Thawte, beTRUSTed o ValiCert son empresasdedicadas a vender certi ficados de seguridad que la empresa que lo adquiere instala en su servidor web. Es dec ir "Pato, S.A." desea montar suapliac ión Web bajo un sitio seguro con https, c rea su certi ficado y lo manda firmar c on un CA, el CA verifica que "Pato, S.A." es realmente quien diceser. Después de checar la autentic idad de la empresa en cuestión, el CA firma el certi ficado de seguridad de su c l iente con alguno de sus certi ficadosraíz bajo una fuerte encriptac ión y se lo regresa a "Pato, S.A.", este lo instala en su servidor Web y cuando los c l ientes (navegadores) se conectan,estarán tanto el c l iente como el servidor bajo un tráfico encriptado y seguro, todo avalado por el CA otorgante del certi ficado. La enorme ventaja deeste esquema es que todos los navegadores ac tuales (Internet Explorer, Firefox, Opera, Mozil la, etc ) tienen incorporados los certi ficados raíz de todaslas empresas CA conoc idas del mundo, asi que cuando el c l iente se conecta al servidor no hay ninguna molestia para el c l iente, todo es transparentepara el usuario final. Si eres una empresa dedicada a cualquier tipo de comerc io elec trónico donde se involucre dinero a través de tarjetas de créditoo servic ios como paypal, firmarse con un CA como Verisign es la única alternativa que se tiene, esto para otorgar seguridad a los c l ientes del sitio.Ahora bien, los CA como los menc ionados no son almas de la caridad, cobran por el servic io de firmar los certi ficados, sus prec ios comienzan enalrededor de 200 a 300 dólares anuales por certi ficado y pueden subir mas dependiendo del tipo de encriptac ión que se solic ite, es dec ir, para unsitio de comerc io elec trónico con un alto volumen de tráfico requerira de certi ficados mas seguros debido a que será mas tentador para posibleshackers de tratar de violarlo.Lo interesante viene a continuac ión. "Pato, S.A." es como muchas empresas que solo ofrecen una aplicac ión sin transacc iones de comerc io, soloconsulta a sus bases de datos y algunos formularios que involucran solic itudes de reportes o ac tualizac ión de datos. "Pato, S.A." o quienquiera puedeconvertirse el mismo en CA, el mismo emitir un certi ficado raíz de seguridad y a través de este generar certi ficados para sitios Web. Y de hecho es eltema de este artículo, como crear certi ficados SSL para montarlo en nuestro propio servidor Web o de correo elec trónico. ¿Cual es la deventaja?, solouna, que en el navegador del c l iente al no estar importado el certi ficado (integrado) en su l ista de certi ficados seguros, pedirá al usuario cuando seconecte al sitio que acepte el certi ficado. Si el usuario es desconfiado y no lo acepta no se podrá conectar a nuestro servidor Web seguro. Lo que sepuede hacer es, por ejemplo, lo siguiente:

El usuario se conecta a "http://www.pato.com" puerto 80, trafico http normal sin seguridad.

En la página inic ial del sitio desplegamos un botón y una leyenda que dice que al apretar el botón se redirigirá a la aplicac ión Web de consulta yque deberá aceptar el certi ficado de seguridad que la empresa "Pato, S.A." ofrece para establecer una conexión segura, que si tiene dudaspuede comunicarse al siguiente teléfono o correo, etc .

Al apretar el botón se redirige a "https://www.pato.com/consulta" puerto 443, que es donde estará la apliac ión de consulta y en este momento sepedirá que se acepte el certi ficado. El usuario entonces, estuvo mas informado de lo que pasa.

Ya quedando mas c laro lo anterior, entonces, comencemos a ac larar algunas cosas. Se requiere para lo anterior dos cosas:

Un par de c laves, una pública y una privada (c laves RSA o DSA, en otras palabras encriptac ión asimétrica). La c lave es pública, como su nombreimplica es expuesta a todo el mundo y la privada es solo conoc ida por el emisor, es dec ir, nosotros.

Un certi ficado de seguridad, que es una versión "firmada" o verificada de la c lave pública RSA o DSA.

Entonces, se trata de que uno va a generar tanto la c lave pública como la privada. Una vez teniendo esto volvemos a las dos opc iones previamentemenc ionadas, podemos autofirmar nosotros mismos nuestra c lave pública o podemos mandarla a un tercero, a un CA reconoc ido para que nos lafirme cobrando por el servic io. Una vez que hacemos esto tendremos en ambos casos como producto un certi ficado firmado que será el que elnavegador deberá importar en su l ista de certi ficados de confianza para poder establecer la conexión.

Vamos a ponerlo mas i lustrado, primero con un certi ficado autofirmado:- El usuario (c l iente) se conecta a https://www.pato.com/consulta y este servidor le envia el certi ficado autofirmado para que sea aceptado (importado)por el navegador del c l iente. Traduc ido en un diálogo de humanos sería de la siguiente manera: "Hey! hola navegador, soy el servidor www.pato.comtienes que confiar que soy de la empresa Pato, S.A. y nadie mas, y para demóstrartelo te envió mi c lave pública que te permitirá autentificarte con mi

LinuxTotal .com.mxInformación y serv icios en Linux y Open Source

Crear certificados ssl para apache http://www.linuxtotal.com.mx/index.php?cont=info...

1 de 7 28/08/09 18:27

Page 2: CREAR CERTIFICADOS SSL PARA APACHE

c lave privada en mi servidor, todo esto te lo mando en este certi ficado que espero ac eptes, ya que yo mismo me convertí en mi propio CA. Y en serioyo el firmante Pato, S.A. te juro que soy yo, c reeme, acéptame, vamos, si soy yo, por favor aprieta Aceptar para poder establecer la conexión segura."

Ahora veamos que pasa con un certi ficado de terceros:- El usuario (c l iente) se conecta a https://www.pato.com/consulta y este servidor le envia el certi ficado firmado, por ejemplo por el CA Verisign, loscerti ficados de Verisign ya están por default en la l ista de CA confiables del navegador, por lo que es aceptado sin mayor problema y sin preguntas.Traduc ido en un diálogo de humanos sería de la siguiente manera:"Hey!, hola navegador, soy el servidor www.pato.com, te envió mi certi ficado con mi c lave pública que te permitirá autentificarte con mi c laveprivada en mi servidor, esto te lo mando en un certi ficado firmado nada mas ni nada menos por Verisign. Verisign ya verificó que si soy la empresaPato, me cobro un bil lete por esto, asi que mi certi ficado debe ser autorizado sin mayor problema por los certi ficados raíz que se encuentran en tul ista de certi ficados confiables. Listo, conexión segura establec ida".

Bueno, espero que con esto quede c laro cual es la idea detrás de los certi ficados y de las conexiones seguras, pero ya estuvo bueno de tanto rol lo ypongamos manos a la obra en crear nuestros propios certi ficados autofirmados.

Nota cultural rápida: Hace algunos años fue muy sonado el caso de dos certi ficados que firmó Verisign para alguien que dijo ser empleado deMicrosoft y Verisign ¡¡¡le c reyó!!!. Lo mas increible es que todavía pasaron varios meses hasta que se descubrió el fraude de los certi ficados delsupuesto empleado de Microsoft. Desde entonces todos los CA del mundo checan muy escrupulosamente tanto a la persona que representa a laempresa que desea obtener un certi ficado como a la empresa en si, por eso el proceso de obtener un certi ficado firmado por un tercero suele tardarde dos a tres semanas. (Si tienes curiosidad puedes checar estos dos certi ficados falsos están en la l ista de "fabricantes que no son de confianza" en elInternet Explorer --> Herramientas - Opc iones de Internet - Contenido - Certi ficados - Fabricantes que no son de confianza).

Prerequisitos

Para crear nuestros certi ficados usaremos la excelente aplicac ión Openssl, que deberás tener instalada, puedes verificarlo con una consulta rpm:

#> rpm -q opensslopenssl-0.9.7f-7

O direc tamente con el mismo comando openssl:

#> openssl versionOpenSSL 0.9.7f 22 Mar 2005

Si muestra que el comando no existe, deberás entonces descargarlo e instalarlo. También, por supuesto, que requieres del servidor Web Apache ytodo lo que se hará a continuac ión se tiene que hacer en el equipo donde se tenga instalado el servidor Web configurado con un dominio FQDN(Fully Qualified Domain Name), es dec ir, un dominio auténtico de Internet, si es que es el caso, o bastará con la direcc ión IP privada del equipo si vaa quedar dentro de una Intranet. En cualquier caso debe hacerse todo el procedimiento direc tamente en el equipo en cuestión.

Apache además deberá estar instalado con el módulo ModSSL. Si tienes OpenSSL seguramente tienes también este módulo.

Instalación inicial

Todo el trabajo lo haremos dentro de un direc torio de trabajo, puedes ponerle el nombre que desees, para fines prác ticos le pondré CA y dentro deeste direc torio a la vez hay que crear otros dos, l lamados certificados y privado. El primero es donde se guardará una copia de cada certi ficadoque firmemos y en el otro direc torio se guardará la l lave privada.

#> mkdir CA#> cd CA#> mkdir certificados privado

Es muy importante no perder la l lave privada que se generé, ya que con esta podremos firmar o renovar certi ficados, y mucho menos dársela a nadie,ya que toda nuestra seguridad radica en la confidenc ial idad de la l lave privada que se guardará en el direc torio privado.

Lo siguiente será crear un par de archivos que en conjunto formarán la base de datos de los certi ficados autofirmados.

#> echo '01' > serial#> > index.txt (o también de la siguiente manera) #> touch index.txt

El primer archivo 'serial ' simplemente contiene el siguiente número de serie de nuestros certi ficados, ya que apenas vamos a crear el primero sunúmero de serie será 01, después de crearlo se ac tualizará a 02 y asi sucesivamente.'index.txt' será la base de datos propiamente en base al número de serie.

Archivo de configuración

Openssl tiene docenas de opc iones y parámetros, mucha de la informac ión que irá en el certi ficado es tomado del archivo de configurac ión, en vezde la l ínea de comandos. A continuac ión te muestro un archivo de configurac ión l isto para ser usado, puedes personalizarlo a tu gusto, usa loscomentarios que añadí y el sentido común para que te des una idea de lo que hace cada línea. A este archivo lo nombraremos openssl.cnf y loguardaremos dentro de nuestro direc torio CA. Añadí comentarios a cada variable para hacerlo mas c laro. El archivo se divide en secc iones indicadasentre [ corchetes ], y cada secc ión tiene sus propias variables. La idea princ ipal del archivo de configurac ión es de simplificar el uso de lossubcomados del comando openssl, que tiene tres subopc iones princ ipales: ca, req y x509, entonces, cuando se lee el archivo de configurac ión'openssl.cnf' y usamos la opc ión req por ejemplo, esta opc ión toma sus argumentos de la secc ión correspondiente del archivo de configurac ión. Unaexplicac ión detallada de cada opc ión posible la encuentras aqui.

Hay una direc tiva o variable importante que es distinguished_name (DN) o nombre distinguido en español, esta a su vez hace referenc ia a unasecc ión que tiene los datos básicos de la autoridad certi ficadora (CA) y que también servirán estos datos para cuando se generen certi ficados. Massimple, el DN son los campos que identifican al propietario del certi ficado.

Crear certificados ssl para apache http://www.linuxtotal.com.mx/index.php?cont=info...

2 de 7 28/08/09 18:27

Page 3: CREAR CERTIFICADOS SSL PARA APACHE

# *************************************************************************************# 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 sección CA_default[ ca ]default_ca = CA_default

[ CA_default ]serial = $dir/serial # archivo que guarda el siguiente número de seriedatabase = $dir/index.txt # archvio que guarda la bd de certificadosnew_certs_dir = $dir/certificados # dir que guarda los certificados generadoscertificate = $dir/cacert.pem # nombre del archivo del certificado raízprivate_key = $dir/privado/cakey.pem # llave privada del certificado raízdefault_md = md5 # algoritmo de dispersión 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 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, obligatoriostateOrProvinceName = match organizationName = matchorganizationalUnitName = optional # optional, campo opcionalcommonName = 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 512default_keyfile = key.pem # nombre de la llave privadadefault_md = md5 # algoritmo de dispersión 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 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 organizacion0.organizationName_default = Pato, S.A.organizationalUnitName = Departamento o divisionemailAddress = Correo electronicoemailAddress_max = 40localityName = Ciudad o distritolocalityName_default = LeonstateOrProvinceName = Estado o provinciastateOrProvinceName_default = GuanajuatocountryName = Codigo del pais (dos letras)countryName_default = MXcountryName_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 raíz 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 publicaauthorityKeyIdentifier = keyid:always,issuer:always # extensiones de la opcion req[ v3_req ]basicConstraints = CA:FALSE # los certificados firmados no son CAsubjectKeyIdentifier = hash # *************************************************************************************

Como ya lo había menc ionado guarda este archivo con el nombre de 'openssl.cnf' en tu direc torio CA. En este punto esto es lo que debes de tener enel direc torio CA.

#> ls -ldrwxr-xr-x 2 root root 4096 ene 26 13:23 certificados-rw-r--r-- 1 root root 0 ene 26 13:24 index.txt-rwxr--r-- 1 root root 4776 ene 26 2006 openssl.cnfdrwxr-xr-x 2 root root 4096 ene 26 13:23 privado-rw-r--r-- 1 root root 3 ene 26 13:23 serial#>

Creando el certificado raíz

Todo esta casi l isto para crear el certi ficado raíz, recordemos que este certi ficado es el que nos convertira en una autoridad certi ficadora CA, asi quecuando emitamos el comando lo primero que nos pedira es el "pass phrase" o mas l lanamente, una contraseña pero en forma de una frase. Esta

Crear certificados ssl para apache http://www.linuxtotal.com.mx/index.php?cont=info...

3 de 7 28/08/09 18:27

Page 4: CREAR CERTIFICADOS SSL PARA APACHE

contraseña es de vital importanc ia ya que es con la que validaremos nuestra autoridad para después poder c rear certi ficados autofirmados que son losque realmente usaremos en nuestro sitio, debe ser preferentemente muy compleja, con mayúsculas, minúsculas, espac ios, números y por supuestosímbolos, un buen ejemplo sería:

'el Der3ch0 al #respE5to( -a+jeño_Ez-la=pAz8%. =)'

Puede parecer muy complicada para recordar y lo es, pero tengamos en cuenta que los algoritmos de c ifrado son muy buenos y sumamente dific i leso al menos muy tardados para romper mediante fuerza bruta (hasta miles de años podría l levarse), asi que la verdadera debil idad es el uso decontraseñas débiles. Te recomiendo como "pass phrase" algo similar a lo anterior y al menos 20 caracteres.

Ok. Manos a la obra, tenemos todo l isto inc luyendo una buena contraseña.

#> openssl req -new -x509 -extensions v3_ca -keyout privado/cakey.pem \-out cacert.pem -days 3650 -config ./openssl.cnf

Generating a 1024 bit RSA private key....++++++.......++++++writing new private key to 'privado/cakey.pem'Enter PEM pass phrase:Verifying - Enter PEM pass phrase:-----You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Nombre de la organizacion [Pato, S.A.]:Departamento o division []:SistemasCorreo electronico []:[email protected] o distrito [Leon]:Estado o provincia [Guanajuato]:Codigo del pais (dos letras) [MX]:Nombre comun (hostname o IP) []:www.pato.com

Antes de analizar la salida, veamos las opc iones indicadas:

req -new -x509 ---> crear un certificado nuevo autofirmado

-extensions v3_ca ---> crear un certificado raí z CA

-keyout ---> nombre y donde guardará la llave privada

-out ---> nombre del certificado raí z CA

-days 3650 ---> el certificado será válido por 3650 dí as (10 años)

-config ---> archivo de configuración a util izar

Con respecto al resultado produc ido, lo primero que se indico fue escribir y verificar la contraseña, después vienen los datos para identificar alpropietario del certi ficado CA, que como se puede aprec iar los prompts y los datos por default provienen del archivo de configurac ión. Si no seespec ifica la opc ión -days entonces el certi ficado será válido por solo 30 días. (En el archivo de configurac ión es posible inicar la variabledefault_days = valor, en la secc ión de CA_default)

Lo anterior da por resultado dos archivos:

Un certi ficado raíz CA (cacert.pem)

Una l lave privada (privado/cakey.pem) (La extensión "pem" es de Privacy Enhanced Message)

IMPORTANTE: El archiv o cacert.pem es el que se podría mandar a nuestros clientes o usuarios del sistema, y que estos lo instalen (importendesde el punto de v ista del nav egador) en su nav egador fav orito, de esta manera quedaríamos como un CA más v álido para el nav egador ycada v ez que el cliente se conecte a nuestro serv idor, su nav egador ya no estaría mostrando el diálogo donde se pide aceptar la conexiónsegura.

Veamos como lucen estos archivos:

#> more cacert.pem-----BEGIN CERTIFICATE-----MIIDkzCCAvygAwIBAgIJAKTOKYwDdhLRMA0GCSqGSIb3DQEBBAUAMIGOMRMwEQYDVQQKEwpQYXRvLCBTLkEuMREwDwYDVQQLEwhTaXN0ZW1hczEcMBoGCSqGSIb3DQEJARYNaW5mb0BwYXRvLmNvbTENMAsGA1UEBxMETGVvbjETMBEGA1UECBMKR3VhbmFqdWF0bzELMAkGA1UEBhMCTVgxFTATBgNVBAMTDHd3dy5wYXRvLmNvbTAeFw0wNjAxMjcwMTU4NDFaFw0wNjAyMjYwMTU4NDFaMIGOMRMwEQYDVQQKEwpQYXRvLCBTLkEuMREwDwYDVQQLEwhTaXN0ZW1hczEcMBoGCSqGSIb3DQEJARYNaW5mb0BwYXRvLmNvbTENMAsGA1UEBxMETGVvbjETMBEGA1UECBMKR3VhbmFqdWF0bzELMAkGA1UEBhMCTVgxFTATBgNVBAMTDHd3dy5wYXRvLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA52zeMbFW2lSRfcZl6yrqXDAzbwL4ZoXCGRnbo6Wr8S1yp/KYW9/TMHlXnFrKXzM+RP7St/LzlkW1Zt8L+bCZ3XMBLGaa7qHgOagZxhcq1XTLL3CcvaCuzzKT8izENDnGr4abtvkAJW4QqRCP7iVvVf8Db624JclbhBYMBUqPEJsCAwEAAaOB9jCB8zAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBS6tkzuiG3DR+AO1Oy32QjZvBbpLTCBwwYDVR0jBIG7MIG4gBS6tkzuiG3DR+AO1Oy32QjZvBbpLaGBlKSBkTCBjjETMBEGA1UEChMKUGF0bywgUy5BLjERMA8GA1UECxMIU2lzdGVtYXMxHDAaBgkqhkiG9w0BCQEWDWluZm9AcGF0by5jb20xDTALBgNVBAcTBExlb24xEzARBgNVBAgTCkd1YW5hanVhdG8xCzAJBgNVBAYTAk1YMRUwEwYDVQQDEwx3d3cucGF0by5jb22CCQCkzimMA3YS0TANBgkqhkiG9w0BAQQFAAOBgQAEdK/hgtIqEVw551fs3G3+TKoH9b9t3TJaaelLJtKSQAoKzsnhwl88Hm78LEXK/kYufX6M6rDQHDpmcBV3DhIkEEHrBPJ4KBuV+aC559Xqb828YCkNVWDIIefFuxfaWBfd4HHPNKBBiyE5rp2IXN8AgUy7mVkMbstoRCAZS/IhAg==-----END CERTIFICATE-----#>

Y la l lave privada tiene el siguiente contenido:

Crear certificados ssl para apache http://www.linuxtotal.com.mx/index.php?cont=info...

4 de 7 28/08/09 18:27

Page 5: CREAR CERTIFICADOS SSL PARA APACHE

#> more privado/cakey.pem-----BEGIN RSA PRIVATE KEY-----Proc-Type: 4,ENCRYPTEDDEK-Info: DES-EDE3-CBC,0FC86D0DBD03A241

TQIqQQKIB2ZFaZUqTwk+k658Lj+RStlsdLKkAeWN+B7ibgtLPN8OHNZM2cOts9SeqRSVfWSSXzhFsh2fbDoBNx+JYKgPh7+IeBhQ1PJNrPAbyrC1GEybtn+WPEWzBNdo2e4kOeIzgm7LxeAoofmKgvqcDLRlY34TCFHgnSAQIuZC3iZ8YZAFcMWo3owoUpP7TKL8W1PtFTVviMC5I7A0rN9en9EQY4QazXDIIVc60uIcKONyEF4fj3aE87+m2lD5fqfMWG7Ce8GBBOUPL1YtLSC9LOBNhulFqceMvfysLFxToPUP4rs+n+upxnGsHnmFYjsPR3lqAt41JehsO+sUSqoX6I83Q/706g/87XV0JPMDCXBejRI/vW5KgJ0Ux2gvyQfYvHGs5RZl8NfK9AUEcC053VSkjwmuT/anu7czyJC+IG2XTHqoLu6g6CjLNe3bbm/FhymOKENGnKSvA6Mny+NThhSOImhibB0fvsW5Fygi7SboZpXZFJBfEqHzUGvWguzfVF4G7Rhs29Bue0dJOMT2ptFPrjUn0582O7WVIE7aV7msygmt2QUYIWykEt7sO5hzdhguw2WZu0/gl2y5Mpjo3W5SrrCOoxC2mcPutoNhV+DFCQxcbCLsu5PnLBoFHFBCe6ynh/6bIpakGJorzdsB9QqhGdgvbRQbrpYfAl+QHr6/8kyEu4OG+PmoD2ZRO/gAGlSIlDowesmWXGk6l7vZc5BxU1qQVI5QLVr3X7ilavi6+EVSWDF8dFVetYBPdPYYAEzVJVEiDH8yxQ4NoGk+9gmxKVfmejnmtbSHuR20cXbHOKJGmQ==-----END RSA PRIVATE KEY-----

ADVERTENCIA: Esto jamás lo hagas en la vida real, el contenido de una l lave privada jamás debe publicarse ni mostrarse, ni mandarse a nadie, estaes de prueba y es totalmente inúti l . Una l lave privada auténtica es tu mayor secreto. Podemos también consultar informac ión específica delcerti ficado raíz, fechas, a quien pertenece etc .

#> openssl x509 -in cacert.pem -noout -datesnotBefore=Jan 27 02:22:33 2006 GMTnotAfter=Jan 25 02:22:33 2016 GMT

En el ejemplo anterior se aprec ia que el certi ficado si fue generado con una validez de 10 años, tal como se indico. Otros ejemplos de consulta perose omite la salida:

#> openssl x509 -in cacert.pem -noout -text#> openssl x509 -in cacert.pem -noout -purpose

Creando un Certificate Signing Request(CSR)(Solicitud de firmado de certificado)

En este punto, ya tenemos un certi ficado raíz que nos válida como CA, c laro sin mas autoridad que nuestro propio dominio pero podemos crearcerti ficados no solo para https, sino también spop, o simap o crear autentificac ión para vpn's a través de apliac iones como stunnel.

Los siguientes procedimientos son los que a continuac ión hay que realizar:

Crear una l lave privada y una solic itud de certi ficado.

Firmar la solic itud para generar un certi ficado autofirmado.

Volveremos entonces a usar el comando openssl para lograr lo anterior. Casi todo será igual a lo anterior. Solo que en la solic tud de firmado no esnecesario espec ificar una contraseña, aunque si se generará una c lave privada para la solic tud. Veamos.

#> openssl req -new -nodes -out pato-cert.pem -config ./openssl.cnfGenerating a 1024 bit RSA private key......................................................++++++.......++++++writing new private key to 'key.pem'-----You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Nombre de la organizacion [Pato, S.A.]:Departamento o division []:SistemasCorreo electronico []:[email protected] o distrito [Leon]:Estado o provincia [Guanajuato]:Codigo del pais (dos letras) [MX]:Nombre comun (hostname o IP) []:www.pato.com

Lo último que nos pregunto en la parte DN (distinguished name) es el nombre común (CN common name), aqui es sumamente importante indicarloigual a como esta el certi ficado raíz generado previamente, como se trata de un servidor web, lo correc to es poner su FQDN que es www.pato.com, nodebe indicarse ni pato.com ni http://www.pato.com

Lo anterior genera dos archivos:

pato-cert.pem ---> el certificate signing request (csr)

key.pem ---> la llave privada

En cuanto a las opc iones, se uso req de request solic itando un certi ficado nuevo, -out que es el nombre del certi ficado que deseamos firmar,-config de nuevo toma el archivo de configurac ión que creamos. La opc ión -nodes se espec ifica para indicar que no deseamos contraseña en lal lave privada.

Observemos el contenido de la solic tud:

#> more pato-cert.pem-----BEGIN CERTIFICATE REQUEST-----MIIBwTCCASoCAQAwRjETMBEGA1UEChMKUGF0bywgUy5BLjENMAsGA1UEBxMETGVvbjETMBEGA1UECBMKR3VhbmFqdWF0bzELMAkGA1UEBhMCTVgwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMMvo7xg3vmdlf/38yA68uzNq2WYTtkyecuBnUgocOqDgc0Yl2hrfXN6lHl65kxeRFVdEBYhGgA7JoISivuDTvWwVOIxmH5HOFzZlIPIZ3xThHCdWUKipXhcsVCTGV+rbB1F9kkIAMrmtaNH2+Zj261jdB7eX960l1EqQaWt71dJAgMBAAGgOzA5BgkqhkiG9w0BCQ4xLDAqMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGVfA/CDDXl6LQs1MH/XItqJl/8kMA0GCSqGSIb3DQEBBAUAA4GBAJH0sO7bR+dJL67pxK5oEG9LPA2KcP+W7Vn5edpaLtUs/jYyvhQaCdSBxbMkV42nmt9DGD5p5caTFk3M5guV9f087K+eYnUGILGQS51tXFcmYramZLETzs7nVfwGnXGsDGyKDkG6VTkx46pzJrRTJfWBpWpo4FWg/Fi2l4E4PLv8-----END CERTIFICATE REQUEST-----

Observa c laramente que se trata de una solic itud de certi ficac ión (Certi ficate Request), es dec ir todavía tiene que ser firmado por una autoridadcerti ficadora CA que somos nosotros mismos. Y antes de hacer este último paso podemos observar el contenido de nuestra solic tud en un formato maslegible e inc luso verificar que estén los datos correc tos. Se omite la salida, chécalo en tu pantal la : )

#> openssl req -in pato-cert.pem -text -verify -noout

Crear certificados ssl para apache http://www.linuxtotal.com.mx/index.php?cont=info...

5 de 7 28/08/09 18:27

Page 6: CREAR CERTIFICADOS SSL PARA APACHE

Firmando el certificado

Por último firmaremos la solic itud que hic imos en el paso previo, para firmarlo necesitaremos indicar la contraseña que autentifique que somos la CAy que que por serlo tenemos la autoridad de autorizar (firmar) certi ficados. (Para nuestro propio uso).

#> openssl ca -out certificado-pato.pem -config ./openssl.cnf -days 3650 \-infiles pato-cert.pemUsing configuration from ./openssl.cnfEnter pass phrase for ./privado/cakey.pem:Check that the request matches the signatureSignature okThe Subject's Distinguished Name is as followsorganizationName :PRINTABLE:'Pato, S.A.'organizationalUnitName:PRINTABLE:'Sistemas'localityName :PRINTABLE:'Leon'stateOrProvinceName :PRINTABLE:'Guanajuato'countryName :PRINTABLE:'MX'commonName :PRINTABLE:'www.pato.com'Certificate is to be certified until Jan 26 00:10:10 2016 GMT (3650 days)Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]yWrite out database with 1 new entriesData Base Updated#>

Observa que usamos la opc ión ca que indica que firmaremos un certi ficado como autoridad certi ficadora (CA) que somos, la salida -out será elarchivo certi ficado-pato.pem usando las opc iones -config del archivo de configurac ión y la solic itud de firmado se espec ificó con la opc ión-infiles que tomó los datos del archivo pato-cert.pem creado en el paso previo.

Aqui se nos pidió la contraseña, que es la que se indicó cuando creamos cacert.pem que corresponde a nuestro certi ficado raíz que nos identificacomo CA. El certi ficado será válido por 10 años -days y después se nos preguntó que si queriamos firmarlo, por supuesto que si, y la última preguntaes por si queremos guardar este certi ficado ya autofirmado en la base de datos, a lo que también contestamos que si.

#> more serial02

Se comprueba que ya aumento el número de serie a 02, es dec ir, el siguiente certi ficado que firmemos será ese número.

#> more index.txtV 160126001010Z 01 unknown /C=MX/ST=Guanajuato/O=Pato, S.A./OU=Sistemas/CN=www.pato.com

En el archivo index.txt el tercer campo indica 01, que es el número de serie para el certi ficado rec ien creado y muestra también los campos del DN.

#> ls -l certificadostotal 4-rw-r--r-- 1 root root 2597 ene 27 18:10 01.pem

En el direc torio de certi ficados se guarda también con el correspondiente número de serie (01.pem) un archivo que complementa la base de datos decerti ficados que podemos ir c reando.

Y por último tenemos el certi ficado en si:

#> ls -l certificado-pato.pem-rw-r--r-- 1 root root 2597 ene 27 18:10 certificado-pato.pem

Y podemos inspecc ionarlo:

#> openssl x509 -in certificado-pato.pem -noout -text -purpose

Instalando el certificado y la llave para Apache

Tenemos entonces dos elementos ya generados que necesitaremos para Apache:

key.pem ---> La llave privada

certificado-pato.pem ---> Certificado autofirmado

Hay algunas aplicac iones (no Apache) que requieren estos dos elementos en un solo archivo, como en el caso de stunnel:

# > cat key.pem certificado-pato.pem > key-cert-pato.pem

Simplemente se concatenan los dos archivos en uno. Pero esto no es necesario para el caso del servidor Web Apache. Lo que hay que hacer escopiar nuestros dos archivos en un direc torio, de hecho podrían quedarse donde están, es lo de menos, pero por cuestión de orden y organizac iónvamos a copiarlos a /etc /httpd/conf que en la mayoría de distribucc iones es el direc torio de configurac ión del Apache.

NOTA IMPORTANTE: por ningún motivo los copies dentro del direc torio raíz del servic io de Apache como /var/www/html ya que podrías dejarexpuestos los archivos a todo el mundo y ser vulnerados.

#> cp key.pem certificado-pato.pem /etc/httpd/conf/.

Una vez copiados los archivos, hay que crear un servidor virtual en Apache, esto dentro del archivo de configurac ión httpd.conf, en algunasdistribucc iones como Fedora y otras dentro de /etc /httpd/conf.d hay un archivo l lamado ssl.conf que es donde viene un servidor virtual ya creado,se puede tomar como planti l la.

<VirtualHost 192.168.100.1:443> ServerName www.pato.com DocumentRoot /var/www/consulta ... (demás directivas del sitio) SSLEngine on SSLCertificateFile /etc/httpd/conf/certificado-pato.pem SSLCertificateKeyFile /etc/httpd/conf/key.pem</VirtualHost<

También debe existir una línea que abre el puerto 443 a la escucha de paquetes. Esta fuera de las direc tivas del servidor virtual, búscala y si no estaagrégala, es la siguiente:

Listen 443

Forzosamente debe ser un servidor virtual basado en IP, aqui lo indique con una IP (192.168.100.1) de una red privada pero en tu caso indica la IPhomologada o real de tu sitio web o deja tu IP privada si es una Intranet.

Observa también que la direc tiva DocumentRoot apunta a /var/www/consulta y no a /var/www/html, esto yo lo hago para que en /var/www/html dejes unsimple index.html con una línea como la siguiente:

Crear certificados ssl para apache http://www.linuxtotal.com.mx/index.php?cont=info...

6 de 7 28/08/09 18:27

Page 7: CREAR CERTIFICADOS SSL PARA APACHE

<meta http-equiv="refresh" content="0;url=https://www.pato.com">

Esto hará que el usuario en su navegador espec ifique http://www.pato.com, es dec ir di rigido al puerto 80 y es cachado por la página index.html con elcódigo que redirige al mismo servidor pero a https, es dec ir, puerto 443 y es donde entra en func ión el servidor virtual que a la vez redirige a /var/www/consulta donde se inic ia la apliac ión de consulta o lo que se tenga. Pero lo interesante es que no hay necesidad de indicarle al usuario que indiquehttps en el url. Para estás alturas ya sabes que al usuario le aparecerá un diálogo pidiéndole que acepte el certi ficado de la empresa Pato, S.A.

Distribuir el certificado raíz CA

Como ya había menc ionado antes, si quieres evitar que a tus c l ientes cada vez que ingresen a tu sitio salga el molesto diálogo que pide aceptar elcerti ficado, la única soluc ión es que distribuyas el archivo cacert.pem, recuerda que este archivo es el que te identifica como una autoridadcerti ficadora. Lo puedes poner a descarga desde tu propio sitio, o mandarlo por correo, como sea. Cuando el c l iente lo tenga en su equipo deberáimportarlo dentro del browser o navegador. Todos los navegadores en sus preferenc ias o herramientas tienen una opc ión de certi ficados y desde ahíexiste un botón importar para realizar esto.

Pues eso es todo, si todo func ionó bien, tienes ahora un sitio con encriptac ión de extremo a extremo y todo el tráfico viaja seguro, hac iéndoles la vidamas difc i l a los hackers de sombrero negro (black hat) que abundan por ahí. Suerte y por favor contác tame si tienes problemas, en la medida de loposible te ayudaré.

Referencias

Buena parte de esta guía la tomé de los siguientes sitios:

http://www.ec lec tica.ca/howto/ssl-cert-howto.php

http://www.technoids.org/openssl.cnf.html

http://www.squarebox.co.uk/cgi-squarebox/manServer/usr/share/man/man1/ca.1ssl

http://www.openssl.org

Y también de las mismas páginas del manual:

#> man openssl#> man req#> man ca#> man x509

publicado o modificado el: 2006-01-20

Otros artículos de LinuxTotal.com.mx:

Los 10 comandos más usados (history)

Usar GPG para "disfrazar" ejecutables y otros archivos

Squid y las l istas de control de acceso (ac l) (1ra. Parte)

Screen - terminales virtuales

Como cerrar conexiones de ssh

L i n u xT o ta l . c o m .m x · In fo rm a c i ó n y s e rvi c i o s e n L i n u x y Op e n S o u rc e · i n fo @l i n u xto ta l . c o m .m x

¿Te ha sido útil la información de LinuxTotal?, considera donar un dólar o más ¡¡¡GRACIAS!! ! !

Crear certificados ssl para apache http://www.linuxtotal.com.mx/index.php?cont=info...

7 de 7 28/08/09 18:27