[TUTORIAL] Cómo crear una Autoridad Certificadora (CA) con OpenSSL.

Hace tiempo, a dos compañeros de carrera (Sixto y Jorge) y a mi, nos tocó crear una Autoridad Certificadora (CA) con OpenSSL, para que nos entendamos, poder tener un dominio con https.

Hoy un amigo me ha preguntado si sabía como crear una CA y he aprovechado para publicar un tutorial con todos los pasos a seguir. Vamos al grano:

Creación de estructura jerárquica.

* Lo primero deberemos crear una autoridad certificadora la cual expedirá todos los certificados a los clientes que deseen conectarse con el servidor.

* La comunicación se hará a través de la Web mediante la implantación de un protocolo de seguridad SSL.

* Solamente se confiará en los certificados emitidos por nuestra autoridad certificadora.

* El periodo de los certificados expirará cada 15 días.

Herramientas a utilizar:

* Win32OpenSSL-v0.9.8a.
* appserv-win32-2.4.5.
* Apache_1.3.34-Mod_SSL_2.8.25-Openssl_0.9.8a.
* Internet Explorer.
* Windows XP service pack 2.
* OpenSSL

DESARROLLO

La primera operación que vamos a realizar es la instalación del programa appserv-win32-2.4.5 el cual utilizaremos para poder trabajar con el servidor Apache el local y mysql, tras lo cual pasaremos a la instalación del programa OpenSSl para Windows. El software OpenSSL es un proyecto de software desarrollado por lo miembros de la comunidad Open Source. Es un robusto juego de herramientas que le ayudan a su sistema a implementar el Secure Sockets Layer (SSL), así como otros protocolos relacionados con la seguridad , tales como el Transport Layer Security (TLS). También incluye una librería de criptografía.

Una vez tenemos instaladas todas las herramientas necesarias pasaremos a crear en primer lugar nuestra autoridad certificadora para que pueda expedir certificados digitales a nuestros clientes:

Creación de la Autoridad certificadora (CA)

Para poder crear un certificado primero tenemos que tener una CA (Autoridad Certificadora). ͉sta será la que valida y confirma que nuestro certificado es valido.

Para ello nos colocamos en el directorio OpenSSL/bin y ejecutamos la siguiente instrucción:

-openssl req -x509 -newkey rsa:2048 -keyout cakey.pem -days 3650 -out cacert.pem

Ahora vamos a crear un certificado digital, es decir con nuestra CA.

Primero generamos la clave privada del que sera nuestro certificado digital:

-openssl genrsa -des3 -out serv-priv.pem -passout pass:sslfsv 2048

Antes de hacer un certificado , hay que hacer una petición donde se define el propietario del certificado.

-openssl req -new -subj "/DC=root.com/OU=com/CN=root" -key

serv-priv.pem -passin pass:sslfsv -out petic-certificado-serv.pem

Generamos un fichero que contenga lo siguiente:

basicConstraints = critical,CA:FALSE

extendedKeyUsage = serverAuth

Y lo guardamos con el nombre config1.txt.

Y ahora con el fichero hecho con la configuración hacemos el certificado:

-openssl x509 -CA cacert.pem -CAkey cakey.pem -req -in petic-certificado-serv.pem -days 15 -extfile config1.txt -sha1 -CAcreateserial -out servidor-cert.pem

Y le indicamos que el certificado es para un servidor, como esto lo tenemos en nuestro fichero de configuración se lo indicamos poniendo -extfile y nuestro fichero config1.txt y utilizaremos un algoritmo de cifrado SHA (-sha1).

Configuración Servidor Apache

Ahora lo que tenemos que hacer es que copiar los ficheros servidor-cert.pem y servidor-priv.pem en el direcorio donde tengamos nuestro apache /apache/ssl.

Tambien hay que decirle al servidor que escuche por el puerto seguro 443 que es el puerto seguro para comunicaciones SSL. Para ello habrá que retocar el fichero de configuración httpd.conf y poner lo siguiente en la sección Port.

Listen 80

Listen 443

Hay que decirle a Apache que tiene que cargar el modulo correspondiente al paquete SSL y para ello lo hacemos añadiendo la siguiente instrucción en el apartado de carga de módulos.

LoadModule ssl_module modules/mod_ssl.so

Ademas tambien tenemos que decirle que lo añada a la lista de modulos que tambien disponemos.

AddModule mod_ssl.c

Una vez hecho esto solamente nos queda declarar nuestro server virtual en el fichero de configuracion con las directivas correspondientes para ello añadimos al final del fichero el siguiente fragmento de codigo.

NameVirtualHost *:443

ServerAdmin root@localhost

SSLEngine on

SSLCertificateFile ssl\servidor-cert.pem

SSLCertificateKeyFile ssl\serv-priv.pem

Reiniciamos el servidor y a partir de ahora ya tenemos nuestro server listo para pedir certificados clientes.

Generación de certificados clientes

Ahora tenemos que generar los certificados clientes correspondientes a la peticion, para ello vamos a ver los ficheros que

tenemos hasta ahora:

Por parte de nuestra CA—–>cacert-pem, cacert.srl, cakey.pem (creación de nuestra CA)

Por parte de nuestro certificado de servidor—-> servidor-cert.pem, serv-priv.pem (certificado y clave privada)

Ahora generaremos los certificados cliente que le tendremos que dar a los mismos para que puedan entrar en nuestro sitio web.

Primero generamos la clave privada del cliente:

-openssl genrsa -des3 -passout pass:sslfsv -out client-priv.pem 2048

Tendrá un algoritmo de cifrado triple des (-des3) de 2048 y se almacenara en el fichero (-out) client-priv.pem y con el comando -passout pass: indicamos la passphrase para nuestra clave privada que será sslfsv.

Ahora generamos la petición del certificado:

-openssl req -new -key client-priv.pem -passin pass:sslfsv -subj "/DC=localhost/OU=com/CN=Fsv" -out petic-cert-client.pem

Y ahora finalmente ya podemos emitir el certificado, para ello debemos editar el archivo de configuracion openssl.cnf, pero nosotros lo haremos con un archivo externo al que llamaremos config2.txt y al cual le pondremos las siguientes lineas:

basicConstraints = critical,CA:FALSE

extendedKeyUsage = clientAuth

Y hacemos por fin el certificado cliente para enviarselo a nuestros compañeros para que puedan entrar a nuestro sitio https:

-openssl x509 -CA cacert.pem -CAkey cakey.pem -req -in petic-cert-client.pem -set_serial 3 -days 15 -extfile config2.txt -sha1 -out client-cert.pem

Veamos que estamos haciendo, le indicamos que será un certificado del tipo x509 cuya CA (-CA) está definida en el fichero cacert.pem y que usa como clave privada (-CAkey) el fichero cakey.pem y que el certificado a generar tendrán las especificaciones definidas en el apartado anterior(-req -in) las cuales están en el fichero de petición petic-cert-client.pem.

El certificado tendrá una validez de quince dias (-days 15),le indicamos que el certificado es para un cliente, y como esto lo tenemos en nuestro fichero de configuración se lo indicamos poniendo -extfile y nuestro fichero config2.txt y utilizaremos un algoritmo de cifrado SHA (-sha1).

Tambien le decimos que nuestro certificado tendra el numero 3; es importante decir que este numero se deberia cambiar para realizar distintos certificados cliente, ya que a la hora de revocarlos openssl lo hace por el numero de certificado.

Ahora hay que configurar Apache para que nuestro certicado servidor pida certificados cliente, para ello vamos al archivo de configuración httpd.conf y en la declaracion de nuestro host virtual añadimos las siguientes 2 lineas:

SSLCACertificateFile ssl\cacert.pem

SSLVerifyClient require

Con SSLCACertificateFile, le indicamos donde esta nuestra CA y con SSLVerifyClient require le indicamos que el servidor solicite un certificado al cliente cuando acceda a nuestro site.

Ahora debemos redireccionar las entradas por el puerto 80 (http) para que solo se pueda acceder via Https a nuestro servidor; para ello agregamos las siguientes lineas al archivo de configuracion.

RedirectMatch permanent .* https://127.0.0.1:443

Reiniciamos el servidor y ya esta listo para solicitar certificados a cada persona que entre.

Por ultimo tenemos que crear los certificados que cada cliente debera añadir al navegador. Para ello necesitamos crear con nuestro certificado un fichero comprimido en formato pkcs12 que el navegador entiende.

-openssl pkcs12 -export -in client-cert.pem -inkey client-priv.pem -certfile cacert.pem -out cert-pck12.p12

Esto nos genera el archivo de salida cert-pck12.p12 a partir de nuestro certificado cliente client-cer.pem que tiene como clave privada client-priv.pem y cuya entidad certificadora esta definida en cacert.pem. El nombre cert-pck12.p12 podemos cambiarlo a nuestro gusto para crear certificados personalizados para cada cliente.

Este archivo .p12 es el que cada cliente debe añadir a su navegador para poder ver nuestra pagina web via https.

Revocación de Certificados

Un aspecto importante para poder hacer nuestra CA segura es poder revocar certificados, para asegurarnos de que la perdida de un certificado no supone entradas no autorizadas a clientes que no les hemos dado el certificado correspondiente.

Lo primero que debemos hacer es crear una lista de revocacion en la cual se reflejaran todos aquellos certificados que han sido revocados y por lo tanto son invalidos y no utilizables por los clientes. Para poder hacerla bien, debemos tener en el directorio OpennSSL/bin un archivo de texto llamado index.txt el cual tendrá todas las entradas de certificados revocados (base de datos de certificados revocados).

Tambien tenemos que tener bien configurado el archivo openssl.cnf para que coja las rutas adecuadamente, para ello nos aseguraremos que las siguientes entradas estan bien puestas en dicho archivo:

[ CA_default ]

dir= c:/openssl/bin # Directorio donde esta OpenSSl

certs= $dir/certs # El directorio de certificados (da lo mismo)

#crl_dir= $dir/crl #La dejamos comentada. CRL en raiz

database= $dir/index.txt #Donde tengamos nuestro fichero index.txt

#unique_subject= no #Lo dejamos en ‘no’ para poder crear certificados con el mismo subject

new_certs_dir = $dir/newcerts # Directorio de nuevos certificados(tampoco es importante)

certificate= $dir/cacert.pem #Ruta del certificado de nuestra CA

serial= $dir/serial #El actual numero de serie para los certificados

#crlnumber= $dir/crlnumber #El numero actua de la lista de revocacion. Debe estar comentado

#crl= $dir/crl.pem #La actual lista de revocacion

private_key= $dir/cakey.pem # Localización de la clave privada

RANDFILE= $dir/.rand #Archivo para la generación aleatoria de numeros.

x509_extensions = usr_cert #Extension para añadir a los certificados

Una vez tenemos este archivo bien configurado pasamos a crear nuestra lista de revocación o CRL de la siguiente manera.

-openssl ca -gencrl -out listarev.crl

Tambien deberemos crear el mismo archivo pero con extensión .pem

-openssl ca -gencrl -out listarev.pem

Ahora ya tenemos la lista de revocación creada y ya podemos revocar los certificados cliente que queramos, para ello utilizaremos la siguiente instrucción para revocar un certificado.

-openssl ca -revoke client-cert.pem

Con esto le estamos diciendo que revoque el archivo client-cert.pem que habiamos creado anteriormente. OpenSSL añadirá dicha entrada a la base de datos hasta que actualizemos nuestra lista de revocación que deberemos hacerla con el mismo comando utilizado para crearla.

-openssl ca -gencrl -out listarev.crl

-openssl ca -gencrl -out listarev.pem

Para publicar la lista de revocación CRL en nuestro servidor para que se entere de los certificados que han sido revocados, deberemos copiar los 2 archivos de la lista de rovocación listarev.crl y listarev.pem en el directorio /apache/ssl y configurar el archivo htttp.conf para indicarle donde tenemos la lista de revocación almacenada. El paso de copiar las listas al direcorio de apache/ssl se puede evitar poniendo la correspondiente ruta en el archivo de configuracion hhtpd.conf, para ello añadimos a la entrada de nuestro virtuahost lo siguiente.

-SSLCARevocationFile ssl\listarev.pem

Quedando nuestro virtualhost configurado de la siguiente manera.

NameVirtualHost *:443

ServerAdmin root@localhost

SSLEngine on

SSLCARevocationFile ssl\listarev.pem

SSLCertificateFile ssl\servidor-cert.pem

SSLCertificateKeyFile ssl\serv-priv.pem

SSLCACertificateFile ssl\cacert.pem

SSLVerifyClient require

Reiniciamos nuestro servidor apache con la nueva configuración y ya lo tenemos todo listo para pedir certificados y revocar aquellos que nos interesa por diferentes causas.

BIBLIOGRAF͍A

Las páginas consultadas han sido los siguientes:

http://bulma.net/

http://www.openssl.org

http://www.apache.org/

Libro consultado:

-SERVIDOR APACHE 2, Mohammed J. Kabir (Ed. Anaya Multimedia)

ISBN: 8441514682. 1ª edición

Fecha Publicación: Enero 2003

por Victor

Me llamo Víctor López y nací en Zaragoza el 16 de Diciembre de 1984. Esta web la monté exactamente el 23 de Mayo del 2005 con la idea de publicar mis experiencias personales, cosas curiosas que veía a mi alrededor (tanto en Internet como en mi vida) y el poder tener mi propio espacio web en la red. Si quieres puedes ver las estadísticas del año 2010. Ingeniero Superior en informática (terminé la carrera en 2006), desde pequeño ya estaba totalmente convencido a lo que me iba a dedicar en mi vida, la informática. Quizás porque mi padre tenía un Spectrum y me pegaba horas trasteándolo o quizás porque desde pequeño siempre me han gustado “los chismes”. El caso es que empezó a gustarme este mundo de la informática. Profesionalmente soy Analista-Programador Senior en PHP y me dedico al análisis, desarrollo y programación de páginas web y al desarrollo de aplicaciones (principalmente web en PHP, empecé a programar en el año 2002 en PHP), creación, alojamiento, optimización (diseño, SEO, publicidad), puesta en marcha de webs y potenciándolas. Actualmente soy Lead Integration Engineer en EnGrande.com – BudGetPlaces.com, además de formar parte de Homein.com (anteriormente he trabajado en Atrapalo.com, Camyna.com y Sync.es). Socio fundador de Coompy.es Alquilar habitación – Compartir piso. Partidario del software libre y usuario asiduo de Ubuntu y CentOS. Fui usuario de Mac pero ahora ya he vuelto al buen camino con Linux (Ubuntu distro). Sobre mi filosofía de vida, te invito a que leas este artículo: “Tu eres el resultado de ti mismo“. Si lo lees, entenderás mi punto de vista de la vida. Intento estar lo más lejos posible de la monotonía y considero mi trabajo como un hobby, me gusta aprender cosas nuevas cada día y afrontar nuevas metas y proyectos. En mi tiempo libre me gusta practicar cualquier deporte (el fútbol especialmente), me gusta competir (sea el ámbito que sea), los coches, las buenas películas/series y viajar. Personalmente considero que lo primero en esta vida es la salud y las personas, dejando atrás otras cosas, como puede ser el dinero, la fama y todas esas chorradas, que cuanto más las tienen las personas, más las quieren y menos les importan los demás. Y creo que el respeto y educación es fundamental. Pues eso es todo, un breve resumen de mi persona. Si te quieres anunciar en mi blog, contactar conmigo ya sea para la contratación de mis servicios, ofertas, agradecimientos, quejas, insultos, amenazas y/o similares, puedes mandarme un correo cuando quieras. Mi correo personal de contacto es: http://helektron.com/contacto-personal/ Puedes seguir este blog por Google Plus, Facebook, Twitter, RSS y por mail.

22 comentario en “[TUTORIAL] Cómo crear una Autoridad Certificadora (CA) con OpenSSL”
  1. Hola leí tu comentario y tengo las mismas dudas que tú, no he visto que en el blog respondan dudas , y disculpa pero quisiera saber si resolviste las tuyas para que me orientes , Por favor. De antemano gracias.

  2. hola felicidades…lo unico es que veo k no respondes dudas…
    segui los pasos pero me marca un error al momento de crear el certificado, el error es el siguiente:
    root@laboratorio-Satellite-L305:~# openssl x509 -CA cacert.pem -CAkey cakey.pem -req -in peticion.pem -days 3650 -extfile fichero.txt -sha1 -CAcreateserial -out servidor.pem

    Error Loading extension section default
    3073452232:error:0D06407A:asn1 encoding routines:a2d_ASN1_OBJECT:first num too large:a_object.c:109:
    3073452232:error:2206706E:X509 V3 routines:V2I_EXTENDED_KEY_USAGE:invalid object identifier:v3_extku.c:137:section:,name:servAuth,value:
    3073452232:error:22098080:X509 V3 routines:X509V3_EXT_nconf:error in extension:v3_conf.c:93:name=extendedKeyUsage, value=servAuth

    ppodrias ayudarme por favor…..te lo agradeceria infinitamente…
    saludos

  3. Te explicas fatal. De hecho creo que no te explicas. No adjuntas pantallas donde se ve lo que estas haciendo, ni comentas para que sirven las cosas ni nada. Simplemente dices haz esto y ya esta. Das por supuesto que la gente conoce openssl, para que sirve, como se utiliza y demás. Muy mal.

  4. buenas acabo de enterarme de tu sitio web y la verdad es que me parece estupendo no sabia de mas personas interesadas en estos temas, aqui tienes un nuevo lector que seguira visitandote a diario.

  5. tengo las sig versiones Apache/2.2.8 (Win32) mod_ssl/2.2.8 OpenSSL/0.9.8g PHP/5.2.6 Server en win7, pero me marca erro en AddModule mod_ssl.c, me marca erro de sintaxis, también me dice que NameVirtualHost *:443 has no VirtualHosts y por ultimo no puedo crear los archivos de revocación, si alguien me podría ayudar se los agradecería mucho

  6. @Dani me puedes dar una pequeña explicación de como funciona para pdf, supongo que no haces lo de la configuración del Apache o si? a y una duda si en lugar de archivos .pem necesito un .key para la privada y un .cer para la publica puedo cambiar la extensión y funciona? alguien lo hizo?
    gracias

  7. He terminado de configurar el http.conf con el certificado del serivodr y su clave y cuando lanzo el apache me pide que introduja la clave privada lo hago y me sale el siguiente error:OPENSSL_UPLINK:NO OPENSSL UPLINK
    (hE SEGUIDO TODOS LOS PASOS Y HE INSTALADO EL SW QUE PIDE)

  8. He realizado todos los pasos para Crear la CA y generar los certificados firmados pero al momento de poner la configuracion en el httpd como se muestra aqui tal cual no inicia el servicio en win32. Alguna sugerencia?
    Esto es lo que tengo en mi virtual host

    ServerAdmin root@localhost
    SSLEngine on
    SSLCertificateFile ssl\servidor-cert.pem
    SSLCertificateKeyFile ssl\serv-priv.pem

  9. Muchas gracias, llevaba toda la mañana dando vueltas siguiendo varios manuales para hacerme un certificado de prueba para firmar pdf y con este me ha salido todo a la primera

  10. Hola:

    Realise todos los pasos a la perfección, pero tengo errores al validar en el servidor los certificados. que podrá ser, uso apache2

  11. Oigan yo tengo un codigo en java que ocupa archivos .cer y .pfx pero en el codigo maneja el .pfx como llave privada que vendria siendo el .p12 y el cer como llava publica, podrian explicarme esto?

  12. de donde sale el mod_ssl.so.
    poque he bajado uno y he configurado pero al reiniciar el apache me da error en el load_module. estoy usando el appserv y parece que no lo trae.

    hay que instalar Apache_1.3.34-Mod_SSL_2.8.25-Openssl_0.9.8a. porque no dijiste que hacemos con ese archivo

    saludos

  13. Hola, buenas noches tengo el mismo error de albertome da este error alguien me puede ayudar…… gracias

    openssl x509 -CA cacert.pem -CAkey cakey.pem -req -in petic-certificado-serv.pem -days 15 -extfile config1.txt
    Loading «™screen»™ into random state – done
    petic-certificado-serv.pem: No such file or directory

  14. Muy buenas tardes mi estimado, estuve viendo tu artículo y realmente es bueno, fíjate que en la escuela también me dejaron hacer esto. Tengo la siguiente duda.
    Al crear mi CA ya no aparecera el error en el navegaror de «error con el certficado»?, fíjate que yo bajé directamente de apache una versión con ssl la 2.2.8 y pues realmente fue sencillo configurarla. Estuve tratando de integrar mod_ssl y openssl con la versión más actual de appserv 2.5.9 y nunca pude integrarlos, es que no vienen compilados para windows???? Qué consideraciones debería tomar para implementar SSL a mi servidor apache existente por ejemplo un proyecto vertrigo, appserv o cualquier otro proyecto que ya te incluyen php, apache, mysql y phpmyadmin????.
    Otra cosa al instalar el certificado en mi navegador ya no tendré el error de certificado???
    Al crear mi propia CA ya no necesito que una empresa reconocida como Thawte o VeriSign tengan que avalar mi certificado??
    Perdona tanta pregunta pero es que son las dudas que me quedaron al implementar SSL en mi servidor. Te agracería si me pudiera responder mis preguntas ya que son parte del examen.
    Muchas gracias.

    Sinceramente,

    Mahatma Gandhi

  15. Ese error es que no encuentra el fichero petic-certificado-serv.pem en la ruta que le habéis indicado.

    Comprobar eso y me decís.

    Un saludo.

  16. me da este error alguien me puede ayudar

    C:\OpenSSL\bin>openssl x509 -CA cacert.pem -CAkey cakey.pem -req -in petic-certificado-serv.pem -days 15 -extfile config1.txt
    Loading ‘screen’ into random state – done
    petic-certificado-serv.pem: No such file or directory

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *