Mostrando entradas con la etiqueta openssl. Mostrar todas las entradas
Mostrando entradas con la etiqueta openssl. Mostrar todas las entradas
Obtener SSL/TLS Ciphers Soportados
Ufff casi un año sin postear nada, desde que cambié de trabajo estoy extremadamente ocupado y no he tenido tiempo para postear, a pesar de que estuve viendo muchas cosas interesntes. Espero poder retomar un ritmo de post más seguido :)

Con el auge de las vulnerabilidades en TLS/SSL este último tiempo, tuvimos que ir ajustando el listado de ciphers varias veces, ya que los requerimientos son cada vez más exigentes. El problema es la compatibilidad con sistemas operativos/browsers más antiguos, que no soportan las versiones más nuevas de TLS (TLS 1.2) o ciphers más seguros.

Hoy les traigo algo que me sirvió mucho, que es listar los ciphers soportados por un servidor usando un simple script en bash que se basa en openssl. Si bien hay varias tools que hacen esta tarea, siendo la que más uso TestSSLServer, quería algo que pudiera ejecutar desde cualquier lugar, sin depender de tools externas o la instalación de java. OpensSSL está presente en toda las distribuciones, así que no necesitamos nada extra para correr este script.

El core del script lo encontré en este post de superuser, al cual le hice modificaciones para que OpenSSL use SNI, tenga un check básico de parámetros, permita pasar port por parámetro y reporte sólo los ciphers con resultado positivo. Sería un equivalente de TestSSLServer más básico, pero portable :D

#!/bin/bash -e

if [ "$1" == "" ]; then
    echo "usage: $0  [port]"
    exit
fi

if [ "$2" == "" ]; then
    PORT=443
else
    PORT=$2
fi

# OpenSSL requires the port number.
SERVER=$1:$PORT
DELAY=1
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')

echo -n "Checking if server is up... "
result=$(echo -n | openssl s_client -connect $SERVER 2>&1)
if [[ "$result" =~ "Connection timed out" ]]; then
    echo "FAIL - connection time out"
    exit 1
fi
echo "OK"

echo "Obtaining cipher list from $(openssl version)."
for cipher in ${ciphers[@]}; do
    result=$(echo -n | openssl s_client -cipher "$cipher" -servername $SERVER -connect $SERVER 2>&1 || echo "")
    if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher    :" ]] ; then
        echo $cipher
    fi
    sleep $DELAY
done
Crear una CA con OpenSSL y firmar/revocar certificados con ella
Ya es el 4to  artículo (o fueron más?) que escribo sobre certificados digitales, y sin embargo siempre me encuentro con algún requerimiento nuevo. Esta vez necesitaba crear una CA propia para firmar mis certificados, y como siempre, decidí utilizar OpenSSL.

En los siguientes pasos describiré cómo crear la susodicha CA y cómo firmar certificados con la misma.

Si les interesa, pueden dar un repaso a los otro artículos del tema:
- Certificados Digitales
- Firmando una CA propia
- Shortcuts: comandos OpenSSL para generar claves, certificados y testear conexiones


1. Configurar OpenSSL

El primero paso es copiar o editar la información en /etc/ssl/openssl.cnf. Son pocos los campos que es importante/requerido editar. El resto pueden modificarlos también, pero  la idea acá es mostrar los requerimientos mínimos.

En el archivo openssl.cnf buscar y editar los siguientes valores:
[ CA_default ]
dir             = /ca
...
new_certs_dir   = $dir/newcerts
certificate     = $dir/ca.crt
...
private_key     = $dir/ca.key
...
default_days    = 365
donde:
  • dir: directorio que alojará la información de la CA, como certificados firmados, base de datos, número de serie, etc.
  • new_certs_dir: donde se alojarán los certificados firmados.
  • certificate: ubicación del certificado de la CA.
  • private_key: la clave de la CA.
  • default_days: cantidad de días de validez de un certificado por default.
También será de mucha utilidad pegarle una mirada y editar lo siguiente:
[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = AR
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Buenos Aires
localityName                    = Locality Name (eg, city)
0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Super CA
Estos datos facilitan la vida al generar certificados, ya que se tomarán por default y no habrá que cargarlos cada vez que se genere un nuevo request.

Una vez finalizada la edición, realizar lo siguiente en el directorio default (ver variable dir de la configuración):
  • crear los archivos de texto index.txt y serial:
    # touch /ca/index.txt /ca/serial
    donde:
    index.txt es la base de datos de certificados firmados por la CA.
    serial cotiene el número de serie que debe colocarle al próximo certificado que firme.
  • al archivo serial, agregarle un valor. Este será el número de serie que imprima al primer certificado que genere, luego lo actualizará solo. El valor debe ser de dos dígitos:
    echo "01" > /ca/serial
  • crear el directorio para los certificados nuevos, si es que todavía no existe. Para el ejemplo dado:
    # mkdir /ca/newcerts

2. Generar clave y certificado de CA

Claramente la CA debe contar con su propia clave y certificado. Estos se utilizarán para firmar los certificados que se requieran luego. La forma más rápida es utilizando un sólo comando:
# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /ca/ca.key -out /ca/ca.crt -config /ca/openssl.cnf
Generating a 2048 bit RSA private key
...+++
..........................................+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into 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 blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AR]:
State or Province Name (full name) [Buenos Aires]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Super CA]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:super-ca.com
Email Address []:
Como verán, el archivo de configuración hace que los valores de "Country Name", "State or Province Name", etc se tomen de ahí.


3. Firmar certificados

En los anteriores artículos expliqué cómo generar un request de certificado, por lo que no me explayaré en eso. Les dejo el siguiente comando que crea una clave y CSR, y además utiliza como template el archivo de configuración:
# openssl req -new -newkey rsa:2048 -keyout prueba.key -out prueba.csr -config /ca/openssl.cnf
Generating a 2048 bit RSA private key
......................................+++
....+++
writing new private key to 'prueba.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into 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 blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AR]:
State or Province Name (full name) [Buenos Aires]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Super CA]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:superprueba.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Ok, ahora si a lo bueno, con este simple comando podremos firmar los request de certificados que deseemos:
# openssl ca -cert /ca/ca.crt -keyfile /ca/ca.key -in prueba.csr -out prueba.crt -config /ca/openssl.cnf
Using configuration from /ca/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 2 (0x2)
Validity
   Not Before: Jan  5 15:40:56 2015 GMT
   Not After : Jan  5 15:40:56 2016 GMT
Subject:
   countryName               = AR
   stateOrProvinceName       = Buenos Aires
   organizationName          = Super CA
   commonName                = superprueba.com
X509v3 extensions:
   X509v3 Basic Constraints:
CA:FALSE
   Netscape Comment:
OpenSSL Generated Certificate
   X509v3 Subject Key Identifier:
EE:9C:75:57:66:F6:3E:FA:D9:CF:6F:06:60:E0:97:D1:EE:EC:14:EA
   X509v3 Authority Key Identifier:
keyid:98:7A:32:95:93:72:24:37:B0:16:61:10:8D:E7:51:5F:54:95:C7:62
Certificate is to be certified until Jan  5 15:40:56 2016 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

4. Revocar certificados

Finalmente, y porque seguro les sucederá en algún momento, veamos cómo revocar un certificado. Es tan simple como ejecutar el siguiente comando:
# openssl ca -revoke prueba.crt -config /ca/openssl.cnf
Using configuration from /ca/openssl.cnf
Revoking Certificate 01.
Data Base Updated
Si miran el archivo index.txt, podrán observar una R al principio de la línea del certificado.

Un tip interesante, es qué pasa si no tenemos el certificado que queremos revocar. En este post de stackoverflow explican una forma de hacerlo.
OpenSSL guarda una copia de los certificados que firma en el directorio "newcerts" (o donde lo hayan configurado en openssl.cnf). Los certificados se guardan con el número de serie como nombre, por lo que primero hay que hayar el número de serie del certificado que queremos revocar. Un simple grep puede ayudarnos en este caso:
# grep "prueba" /ca/index.txt
V       160105143331Z           01      unknown /C=AR/ST=Buenos Aires/O=Super CA/CN=prueba
donde vemos que el ID es 01.
Con esta info, ejecutamos el comando anterior de la siguiente manera:
# openssl ca -revoke newcerts/01.pem -config /ca/openssl.cnf

Referencias

- How To Setup a CA
Shortcuts: comandos OpenSSL para generar claves, certificados y testear conexiones

OpenSSL es una herramienta extremadamente potente, la cual permite hacer todo tipo de manejos relacionados a TLS/SSL, desde creación de claves y certificados, realizar conexiones tipo telnet a servicios que se ejecutan sobre SSL, hasta generar hashes de archivos, entre otras cosas.
A continuación les dejo un listado de comandos útiles a realizar con OpenSSL. La mayoría se centran en la creación y manipulación de claves y certificados, algo que todo administrador ha tenido que hacer alguna vez.
Ya había escrito sobre la creación de certificados en el artículo Certificados Digitales, donde podrán encontrar una explicación más detallada sobre ello. En éste la idea es dejar un acceso rápido a comandos que nos serán muy útiles, además de proveer varios comandos adicionales a los descriptos anteriormente.
Cabe mencionar que muchos de estos comandos los aprendí gracias al artículo The Most Common OpenSSL Commands y los completé con el excelente OpenSSL Command-Line HOWTO y Creating an SSL Certificate of Authority.


Claves

Generar clave RSA de 4096 bits encriptada con 3des:
  $ openssl genrsa -des3 -out superkey.key 4096

Desencriptar la clave privada
  $ openssl rsa -in superkey.key -out super-decrypted.key

Extraer la clave privada de un archivo en formato PKCS#12:
  $ openssl pkcs12 -in certificad.pfx -out clave.pem -nodes -nocerts

Verificar clave RSA:
  $ openssl rsa -in interbankingtestmil-open.pkcs -check

 
Convertir formatos

Convertir clave de formato tradicional a pkcs8:
  $ openssl pkcs8 -in key.pem -topk8 -out pkcskey.pkcs

Convertir un certificado PEM y una clave privada en un archivo formato PKCS#12 (.pfx o p12)
  $ openssl pkcs12 -export -out certificado.pfx -inkey clave.pem -in certificado.crt -certfile certificadoCA.crt
 
 
Certificados

Crear una CA Propia con validez de 10 años y clave RSA de 4096 bits:
  $ openssl req -new -x509 -days 3650 -extensions v3_ca -newkey rsa:4096 -keyout private/newca.pem -out newca.crt //-config /etc/ssl/openssl.cnf

Generar un request de certificado:
  $ openssl req -new -key superkey.key -out certrequest.csr

Autofirmar request de certificado (CSR):
  $ openssl x509 -req -days 3650 -in cert-request.csr -signkey ca.key -out certificado.crt
 
Firmar request con CA:
  $ openssl ca -in cert-request.csr -out certificado.crt -days 3650

Crear clave y certificado autofirmado en un solo paso:
  $ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt

Extraer el certificado incluído en un contenedor PKCS#12:
  $ openssl pkcs12 -in certificad.pfx -out certificado.crt -nodes -nokeys

Ver los campos de un request de certificado:
  $ openssl req -noout -text -in certrequest.csr

Ver campos del certificado:
  $ openssl x509 -in certificado.crt -text -noout
 
Ver campos de un contenedor PKCS#12:
  $ openssl pkcs12 -info -in certificado.pfx


Otras utilidades

Conectar a un servicio que se ejecuta sobre SSL (por ejemplo HTTPS):
  $ openssl s_client -connect servidor:443

Calcular el hash MD5, SHA1, SHA2, etc de un archivo y de un texto
  $ openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] archivo
  $ echo "texto" | openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1]

Firmando una CA propia
En estos días me di a la tarea de averiguar la posibilidad de firmar nuestra CA (Certificate Authority). Por si no tienen fresco el tema de certificados digitales, pueden releer el artículo Certificados Digitales que publiqué hace casi un año.

Una autoridad certificante, conocida por sus iniciales CA, es una entidad que firma certificados digitales. Recuerden que un certificado no vale de nada si no está firmado por una CA de confianza. Existe una lista de CAs consideradas de confianza e incluidas en la mayoría de los browsers u otro software que trabaje con certificados. Hay CAs comerciales que cobran por firmar certificados y otras CAs que lo hacen de manera gratuita, pero respetando algunas consideraciones.

En una red interna, como la que poseemos en la empresa que trabajo, suele utilizarse una CA propia, no confiable por el resto del mundo. Lo que se hace es montar una CA con algún programa como Microsoft CA u openSSL y firmar certificados que se utilicen internamente. Para que los certificados sean confiables, primero debe agregarse el certificado de la CA interna en los browsers y/o todo programa que necesite certificados. En Becoming a X.509 Certificate Authority y howto create an intermediate Certificate Authority (CA) using openssl pueden encontrar información sobre cómo crear sus propias CAs utilizando openSSL.

Ahora, qué sucede si queremos que los certificados firmados con nuestra CA sean confiables por todos los browsers/aplicaciones? tenemos dos opciones:
- Nos volvemos una CA root, para lo cual deberemos convencer de que somos confiables a todos los programas importantes que utilicen certificados. Esta opción es casi imposible, a menos que realmente obtengamos un muy gran respaldo. Algunas de las CA root son VeriSign, Thawte, y GlobalSign.
- Hacemos que nuestra CA se convierta en una CA intermedia. Esto es, pedimos a una CA root que firme el certificado de nuestra CA, con lo cual, por la cadena de confianza, todo certificado que expida nuestra CA será confiable.

Obviamente en mi búsqueda apunté a la segunda opción, así que comencé a consultar las CAs root más importantes para saber si se puede realizar tal acción. Envié la consulta a VeriSign, Thawte, Entrust y GlobalSign. De estas, en un plazo de dos días, sólo contestaron dos, Thawte y GlobalSign. Por su parte Thawte respondió no proveer tal servicio, mientras que GlobalSign si. Debido a que VeriSign posee representantes en distintos lugares del mundo, contacté a CertiSur, los encargados en Latinoamérica. Por suerte CertiSur contestó bastante rápido y me ofreció su versión Autoridad Certificante Administrada (Managed PKI), pero que no es para firmar CAs externas, sino que expiden certificados a nombre de tu empresa, firmados por VeriSign.

El único que me ofreció el servicio que yo buscaba es GlobalSign. Quedé muy contento con la atención al cliente, respondiendo mis preguntas rápidamente y explicándome cómo funciona el servicio (a pesar de que mi ingles no debe ser el mejor). El servicio de GlobalSign consiste en 3 piezas. Por un lado está el setup inicial donde ellos firman nuestra CA con un costo de u$s12,500. La segunda pieza es el hardware donde se almacenan las claves privadas, que cuesta entre u$s6k y u$s20k. Por último, tenemos el pago por los certificados que vamos a otorgar anualmente. Mientras más certificados firmemos, menor será el costo. Claro está que es mucho más barato pagar estos certificados que los que emite GlobalSign directamente.
Como podrán observar, poner una CA propia no es para nada económico... nosotros desistimos luego de observar estos precios.

Igualmente fue una experiencia muy interesante, contactando empresas grandes en busca de un objetivo bastante especial. Ojalá algún día pueda poseer una CA propia =P
Certificados Digitales
A continuación voy a describir los pasos necesarios para crear un certificado autofirmado y también cómo hacer para crear uno firmado por una autoridad certificante (CA) de confianza.

Los certificados sirven para validar quienes somos, es decir, que una tercera parte puede estar tranquilo de que está tratando con la entidad que cree y no con un atacante que la está falsificando. Además los certificados contienen la clave pública de la entidad con la que estamos tratando así que es posible crear una conexión segura (los datos viajan encriptados) a partir de una negociación previa utilizando dicha clave.
Los certificados suelen encontrarse frecuentemente al navegar por la web, cada vez que el browser accede a un sitio https un certificado es transmitido y usado para autenticar y transmitir los datos de forma segura. Si queremos montar una conexión segura entre nuestro servidor web y un usuario, necesitamos crear un certificado y configurar dicho servidor para que lo utilice.
La confianza de un certificado se logra gracias a que una Autoridad Certificante en la que confiamos (los navegadores cuentan con certificados de Autoridades Certificantes de confianza) firma nuestro certificado con su clave privada. El browser puede comprobar que un certificado fue firmado por una dada CA porque cuenta con su clave pública. Una CA de confianza sólo firmará nuestro certificado una vez que compruebe que somos quienes decimos ser.


El formato de los certificados encontrados comúnmente siguen la recomendación X.509 de la serie de recomendaciones X.500 de ITU-T, e incluye:

- Versión: el identificador del certificado.
- Algoritmo de firma: el algoritmo utilizado para firmar el certificado.
- Nombre del emisor: nombre X.500 de la CA que creó y firmó el certificado.
- Período de validez: consiste en dos fechas que indican el período de validez del certificado.
- Nombre de la entidad: nombre del usuario al que hace referencia el certificado.
- Información de la clave pública de la entidad: clave pública de la entidad junto con un identificador del algoritmo que debe usarse para esta clave.
- Identificador único del emisor (opcional): identifica unívocamente la CA que firma en el caso que el nombre X.500 se halla reusado para distintas entidades.
- Identificador único de la entidad (opcional): identifica unívocamente a la entidad en el caso que el nombre X.500 se halla reusado para distintas entidades.
- Extensiones: conjunto de uno o más campos de extensión.
- Firma: cubre todos los otros campos del certificado, ésta contiene el código hash de todos los otros campos, encriptado con la clave privada de la CA. Este campo incluye el identificador del algoritmo usado para firmar.


Entonces, qué necesitamos para crear nuestro certificado?
Antes que nada, necesitamos crear un requerimiento de certificado que enviaremos a la CA. La CA firmará nuestro requerimiento y con esto obtendremos nuestro certificado.
Ahora, las CAs de confianza cobran por este trabajo (y si, el mundo es así), por lo que tenemos dos opciones:
1) pagarle a una CA de confianza para que nos firme el certificado.
2) firmar nosotros mismos el certificado y ahorrarnos el gasto.
La solución 2 parece genial, no gastamos un peso y tenemos nuestro certificado... bueno, no es tan así. El problema es que los browsers no confían en nuestra firma (sería bastante feo que lo hicieran), por lo que los clientes verán un hermoso cartel de advertencia y deberán agregar nuestro certificado a su browser para que éste les permita seguir navegando por el sitio. Una vez que el cliente confíe en nuestro certificado, los datos viajarán encriptados de forma segura. Pues bien, el factor clave está en que el cliente confíe en nuestro certificado... piensen que como nosotros firmamos nuestro certificado, cualquier otra persona podría hacer exactamente lo mismo (decir que somos nosotros) y el cliente no podría distinguir entre quién miente y quién dice la verdad. Esta solución es perfecta si sólo necesitamos que los datos viajen encriptados.
Si necesitamos que nuestro servidor se autentique para que el cliente confíe en nosotros, deberemos pagarle a una CA.

NOTA: Para una explicación más extensa sobre los certificados X.509, pueden leer el capítulo 14.2. "X.509 Authentication Service" del libro "Cryptography and Network Security Principles and Practices - 4th edition", de William Stallings.
También está interesante el capítulo 8.5 "Management of Public Keys" del libro "Computer Networks - 4th edition", de Andrew S. Tanenbaum.


Cuánto cobran las CAs?
Depende de la CA. Hay CAs que son más confiables que otras, y por lo tanto, cobran mucho más.
Una lista reducida con algunas de las CAs que reconoce Firefox (e Internet Explorer) como confiables es:
http://www.entrust.net
http://www.geotrust.com
http://www.globalsign.com
http://www.rapidssl.com
http://www.verisign.com/
http://www.thawte.com/
http://www.godaddy.com <--- el más barato! Para saber cuáles otras reconoce firefox, pueden visitar http://www.mozilla.org/projects/security/certs/included/


Ya me leí toda la intro y tengo re claro como son los certificados (o bien no entendi un pedo pero sigo leyendo), cómo creo un certificado?

La solución que voy a mostrar es para un sistema GNU/Linux. Utilizaremos openSSL para crear los certificados y Apache como servidor web (clásica combinación linuxera). Si quieren saber cómo hacerlo en Windows, lo lamento pero nunca lo he hecho, así que tendrán que buscar ustedes mismos, el formato general será el mismo, pero las herramientas usadas pueden variar.

Los pasos a seguir son:
1) Generar una clave para el servidor útil para el algoritmo RSA, protegido con una frase de paso y de 4096 bits:
# openssl genrsa -des3 -out server.key 4096
Generating RSA private key, 4096 bit long modulus
.............++
...........................................++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
2) Crear un pedido de firma de certificado:
# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into 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 blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:AR
State or Province Name (full name) [Some-State]:Buenos Aires
Locality Name (eg, city) []:Capital Federal
Organization Name (eg, company) [Internet Widgits Pty Ltd]:itfreekzone
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:itfreekzone.blogspot.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:mipassword
An optional company name []:
Como pueden observar, este comando nos pide una serie de datos. Algunos son opcionales (los que finalizan con []) y otros son mandatorios. Entre los datos tenemos, el código de dos letras de nuestro país, el nombre de la provincia o estado, el de la ciudad, el de la organización, el de la unidad dentro de la organización. Hay que prestar especial atención al Common Name, el nombre que pongamos acá deberá coincidir con la dirección DNS que queremos autenticar. En mi caso la dirección que quiero certificar es itfreekzone.blogspot.com. Pongan la dirección exacta, o en caso contrario el certificado no servirá. Luego podemos colocar una dirección de email, y a continuación un password y un nombre de compañía opcionales.

A partir de acá tenemos dos caminos, uno es enviar el pedido recien generado a una Autoridad Certificante para que nos firme el certificado. Si enviamos el pedido a una CA, ésta comprobará nuestra identidad (dependiendo de la CA pueden requerir más o menos datos) y luego nos devolverá el certificado firmado para que podamos utilizarlo. En este caso, saltar al paso 4. Caso contrario, pasar a 3.

3) Vamos a auto-firmar nuestro certificado con validez de 365 días. Para auto firmarnos necesitamos ejecutar el siguiente comando:
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=AR/ST=Buenos Aires/L=Capital Federal/O=itfreekzone/CN=itfreekzone.blogspot.com
Getting Private key
Enter pass phrase for server.key:
Con esto obtenemos server.crt el cual es el certificado ya firmado y listo para usar.

4) Ya tenemos nuestro certificado firmado, ya sea porque lo auto-firmamos o porque una CA nos firmó y ya nos entregó el certificado. El siguiente paso es hacer que Apache vea el certificado y lo utilice. A esta altura debemos tener lo siguiente:
server.key - la clave del servidor
server.crt - el certificado firmado
Si nuestro certificado está firmado por una CA de confianza, tal vez también necesitemos un nexo con nuestra CA para que los browsers confíen en nuestro certificado. En nexo se llama CA bundle y los CAs lo entregan junto con nuestro certificado firmado. En este caso, además de los archivos anteriores, también tendremos el ca-bundle.crt.
Por otra parte, si no queremos que cada vez que carguemos Apache éste nos pida la clave de paso de server.key, sería conveniente eliminar la encripción sobre la clave. Esto puede resultar peligroso, dado que si se roban este archivo, tendrán la clave, pero se torna muy complicado estar ingresando la clave cada vez que el server deja de funcionar. Si por ejemplo tenemos la configuración para que nuestro servidor se auto-recupere, o que alguien más pueda levantar el servidor, la página no funcionará con ssl a menos que se provea la clave. Yo elijo dejar la clave sin encripción.
Para desencriptar el archivo server.key, ejecutamos lo siguiente:
# openssl rsa -in server.key -out server.key.insecure
Enter pass phrase for server.key:
writing RSA key
Ahora, con todos estos archivos podemos configurar Apache. Primero colocaremos los archivos en un lugar seguro, no accesible a través de la web, por ejemplo en /etc/ssl/crt/, luego cambiamos los permisos para que sólo el usuario apache pueda accederlos y modificamos la configuración de Apache. Dependiendo la distribución que utilicemos el archivo de configuración de ssl puede estar en distintos lugares, por ejemplo en debian, la configuración de la página default está en /etc/apache2/sites-available/default-ssl. Igualmente podemos cambiar las configuraciones de Apache, editando el archivo /etc/apache2/apache2.conf o bien /etc/httpd/httpd.conf en distros basadas en Red Hat.
En fin, en el lugar que puedan configurar ssl, coloquen las siguientes líneas:
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key.insecure
# SSLCertificateChainFile /etc/apache2/ssl/ca-bundle.crt # si tienen un certificado firmado por una CA, descomentar esta línea
Luego reiniciamos Apache:
apache2ctl restart
o bien con:
service httpd restart
si usan algún derivado de Red Hat.


Con esto terminamos con la creación del certificado y la configuración de apache. Sólo restaría la prueba de fuego. Ejecuten un browser y coloquen la dirección de su página anteponiendo https en lugar de http. Si arranca, quiere decir que vamos bien. Vean las propiedades del certificado para comprobar.


Referencias:
Los comandos que utilicé fueron extraídos de http://www.tc.umn.edu/~brams006/selfsign.html
Para saber mejor cómo funciona openSSL pueden visitar http://www.madboa.com/geek/openssl/
Una explicación extra sobre cómo crear un certificado firmado por Go Daddy está en http://www.my-whiteboard.com/ecommerce/how-to-generate-an-ssl-certificate-from-godaddy.html
Si les interesa conocer cómo es la negociación de las claves al utilizar https, pueden seguir ésta página http://www.ourshop.org/resources/ssl_step1.html


Espero que les haya resultado tan interesante como a mi. En su momento tuve que leer varias páginas para encontrar toda ésta información y perder un par de días para poder armar un servidor seguro con un certificado firmado por una CA. Mi intensión es que con este artículo puedan hacer el mismo trabajo y a su vez puedan entender la forma en que funciona. Igual siempre es interesante leer artículos extra para sacarse dudas.
La parte teórica siempre es la base para entender un mecanismo, pero hasta que no lo implementan no se chocan con realidad, osea, el cómo lo hago. Por eso es que incluí tanto teoría como un ejemplo práctico, para que puedan tener el concepto completo.

Espero comentarios y sugerencias.