Estas aquiContenido / Apache con SSL
Apache con SSL
Como dicen que los consejos salen gratis y que siempre es mejor enseñar a pescar que regalar una caña, he dedicado de nuevo un rato a escribir una breve nota sobre cómo se añade a un Apache 2 la posibilidad de conexión cifrada con SSL. Así, quien quiera empezar a montarse en casa un pequeño "laboratorio de pruebas" ya tiene por donde empezar...
Los pasos que se detallan a continuación han sido realizados en Arch Linux 0.8 (Voodoo), con Apache 2.2.3-2 y OpenSSL 0.9.8d-1. No creo que hoy en día sea difícil instalar ambas cosas en cualquier distribución, y son los únicos requisitos previos. Tampoco creo que sea muy diferente en Windows.
Insisto: el artículo está actualizado y los resultados comprobados -en las condiciones antedichas- a día de hoy, algo que no suele ocurrir en los cientos de tutoriales al respecto que corren por Internet. De hecho, este minitutorial quedará defasado en pocos meses, a nada que evolucionen navegadores, servidores y demás, pero ahora mismo su frescura es su mayor ventaja. Por tanto, el momento ideal para ponerse manos a la obra es ahora mismo.
Debe quedar también claro que no se pretende enseñar a instalar un servidor seguro plenamente operativo y asegurado en un entorno de producción, sino solamente un arreglo rápido para utilizar en un localhost casero. Quien afronte metas más comprometidas habrá de investigar un poco por su cuenta.
Sin más, intentaremos lograr el objetivo en muy pocos pasos, descritos -espero- de la forma más sencilla posible.
1. Generar CLAVE PRIVADA:
Llamaremos a nuestro servidor p.ej. ciberia (sustituye "ciberia" por el nombre-url del tuyo). Para generar una clave privada RSA protegida por contraseña:
$ openssl genrsa -des3 > ciberia.key
La protección de la clave por contraseña (para lo que puedes utilizar también AES) presenta el inconveniente de que tendrás que teclear esta contraseña cada vez que arranques el servidor y que si la olvidas se acabó.
Por eso, si prefieres la comodidad a la máxima seguridad (por ejemplo, se trata de tu servidor de pruebas) y estás "seguro" de que la clave no va a caer en malas manos (o no importa), puedes optar por no proteger con contraseña:
$ openssl genrsa > ciberia.key
2. Generar CSR (CERTIFICATE SIGNING REQUEST):
Ahora generamos una petición para enviar a una Autoridad de Certificación y solicitar que firme nuestra clave y nos devuelva un certificado.
$ openssl req -new -key ciberia.key > ciberia.csr
Responde a las preguntas sobre país, provincia. ciudad, empresa, nombre y e-mail.
El fichero generado podrías enviarlo a una autoridad de certificación (como Verisign, de pago, o CACert, gratuita aunque no del agrado de Microsoft) para que lo firmaran y te enviaran tu certificado, pero haremos algo aún mejor: crearemos nuestra propia autoridad de certificación.
3. Crear nuestra propia AUTORIDAD DE CERTIFICACIÓN (CA):
$ /etc/ssl/misc/CA.pl -newca
(ojo: el path a CA.pl puede ser distinto en tu distribución).
Presiona Enter y propociona la que será contraseña de acceso a la clave privada de esta nueva autoridad. Proporciona país, provincia, ciudad, etc. para esta autoridad.
Enhorabuena. Ya eres el feliz propietario de una flamante "Autoridad de Certificación", contenida en el nuevo directorio demoCA. El fichero cacert.pem contiene su clave pública, mientras que en private/cakey.pem dispones de la clave privada que te permitirá crear certificados para tus "clientes".
4. CREAR CERTIFICADOS:
Como ejemplo, empecemos por firmar el CSR que generaste en el paso 2.
$ openssl ca -policy policy_anything -out ciberia.crt -infiles ciberia.csr
Introduce la contraseña de tu autoridad cuando se te pida. Pulsa 'Y' cuandos se te pregunte si deseas firmar e 'Y' también para ejecutar (commit) el cambio en tu base de datos.
Vamos a generar también un certificado autofirmado para tu propia autoridad certificadora (en el apartado 6 verás para qué). Sitúate en el directorio de tu autoridad (demoCA) y teclea:
$ openssl x509 -req -days 365 -in careq.pem -out cacert.crt -signkey ./private/cakey.pem
5. AÑADIR CERTIFICADO AL SERVIDOR WEB (Apache 2):
cp ciberia.key /etc/httpd/conf cp ciberia.crt /etc/httpd/conf
Editar /etc/httpd/conf/httpd.conf para descomentar la línea que permite incluir httpd-ssl.conf
Editar /etc/httpd/conf/extra/httpd-ssl.conf para añadir el nombre, email del administrador y puerto de nuestro servidor y editar las líneas de clave y certificado para que digan así:
SSLCertificateFile /etc/httpd/conf/ciberia.crt SSLCertificateKeyFile /etc/httpd/conf/ciberia.key
Sólo resta arrancar de nuevo el servidor y conectarse a https://ciberia (o el nombre de tu servidor) para comprobar que funciona.
6. NAVEGADORES WEB:
Si ejecutaste los pasos anteriores (y todo ha ido bien) verás que al acceder por primera vez a tu servidor "seguro" el navegador duda de la autenticidad de tu flamante certificado, porque en última instancia duda de tu autoridad certificadora.
La solución consiste en colocar el certificado de tu autoridad (cacert.crt) en algún sitio del servidor, donde pueda ser accedido -o descargado- por los navegadores de tus visitantes. En el caso de Opera y Firefox, al pulsar el enlace el navegador preguntará si aceptas esa nueva autoridad para certificar sitios web, a lo que has de responder (obviamente) 'Sí'. En Explorer has de importar el certificado siguiendo los pasos que te propone el asistente del propio navegador.
Otro artículo de Kriptópolis relacionado:




En Ubuntu 6.10 no existe el directorio /etc/ssl/misc hay que ir directamente al dir de instalación /usr/lib/ssl/misc
buenas kriptopolianos, he seguido los pasos para probar en mi servidor :) pero en el cuarto punto, al intentar crear el certificado autofirmado, no encuentra el archivo careq.pem. Yo tampoco lo encuentro :), como puedo generarlo? gracias!
El fichero está dentro de ese directorio.
me expresé mal. Por alguna razón no se genera el archivo careq.pem (ya he probado varias veces). Los contenidos del directorio demoCA son:
cacert.pem, certs, crl, index.txt, index.txt.attr, index.txt.old, newcerts, private, serial y serial.old.
Uso debian y OpenSSL 0.9.7e (por si te dice algo).
Muchas gracias por la atención y sobre todo ¡FELIZ AÑO NUEVO!
El artículo relacionado que se menciona fue realizado sobre Debian y hay un fragmento donde detalla la estructura del directorio. Como puedes ver, careq.pem también debe estar ahí. Quizás deberías actualizar tu OpenSSL.
Buenos dias a todos:
Realmente este articulo me ha sido de mucho provecho tanto para aclarar ideas como para poner en practica el proceso de creacion de una clave privada, la solicitud y la firma del certificado por parte de la CA. La duda que me surge es la siguiente: tenemos un fichero .key con la clave privada del sujeto A, que desea firmar documentos (firma digital) y a la vez tenemos un certificado (firmado por nuestra CA) el cual permite que otras personas B puedan comprovar un documento firmado por el sujeto A. Si hasta aqui voy bien, dado que aun no tengo claro si el proceso descrito es ente artículo es exclusivo o no para certificados de servidor sobre protocolo https o si por el contrario tambien sirve para firmar documentos i su posterior verificacion, me interesaria saber si alguien a conseguido este proposito. Este planteamiento surge partiendo de la idea que existen targetas que contienen un xip, accesible desde un lectos específico, el cual nos permite interactuar con las funciones de la targeta a través de su interfície (supongo que estàndard ya que utilizo CAPICOM i funciona perfectamente). Pues ahi va la pregunta: es posible crear con openssl un certificado de estas características?
Gracias de antemano
---------------------
Cesar Garcia
---------------------
Cesar Garcia
La respuesta al comentario que deje el pasado 5 de marzo la encontre en la siguiente pagina: http://www.madboa.com/geek/openssl/
Concretamente, solo es necesario crear un fichero de claves (en formato PKCS12) con extension .pfx
El codigo que realiza esto con openssl es el siguiente (sacado de la web anterior):
# create a file containing key and self-signed certificate
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
# export mycert.pem as PKCS#12 file, mycert.pfx
openssl pkcs12 -export -out mycert.pfx -in mycert.pem -name "My Certificate"
Un saludo a todos y espero que a alguien más le pueda servir de ayuda
--------------------- Cesar Garcia
---------------------
Cesar Garcia
Hola,
Llevo 436872 horas intentando hacerlo y siempre me pasa lo mismo. Sigo los pasos para un dominio, por ejemplo intranet.example.com, y funciona. Muevo los certificados a Apache 2.2, me conecto con el navegador, y todo OK.
Vuelvo a repetir el proceso con svn.example.com, generando *otros* ficheros. Muevo esos otros ficheros a Apache, y tanto intranet como svn devuelven el certificado del último.
Solo puedes tener un certificado por ip o puerto ya que la negociacion SSL se realiza antes de solicitar un virtual host u otro.
Implemente perefectamente esta solucion y han salvado el pellejo de un funcionario publico del otro lado del charco.