Cómo crear un certificado SSL de firma propia con OpenSSL y Apache HTTP Server 2013-07-28

Tutorial paso a paso para generar nuestro propio certificado de seguridad SSL con OpenSSL para cifrar información y su configuración bajo Apache HTTP Server en Debian Wheezy

En este nanotutorial vamos a conocer el proceso para generar un certificado de seguridad SSL con OpenSSL así como la configuración del mismo en Apache HTTP Server.

SSL (Secure Sockets Layer) es un protocolo criptográfico que permite la comunicación segura entre un cliente (usuario con un navegador web) y un servidor.

Cómo crear un certificado SSL de firma propia con OpenSSL

Certificado SSL

Un certificado SSL es un certificado digital utilizado por el protocolo para el encriptamiento de la información.

Este certificado es proporcionado por un proveedor autorizado (Verisign, Thawte, Comodo, etc…) y es enviado a el cliente por el servidor con quien estamos estableciendo una conexión segura.

Hay muchos servicios que utilizan este protocolo, algunos ejemplos pueden ser: HTTPS, SMTPS, IMAPS, SSH, POP3S, etc…

El certificado que vamos a crear tiene el mismo nivel de encriptamiento que cualquiera de estos proveedores autorizados puede entregar, simplemente no aparecemos en la lista preestablecida en nuestro navegador, y por lo tanto desconfia del mismo.

Certificado SSL

Instalar OpenSSL

Para instalar OpenSSL debes ejecutar el siguiente comando en tu terminal:

sudo apt-get install openssl

Crear una llave privada

La llave privada nos será útil para la generación del certificado. Una vez creado, nuestro certificado SSL dependerá de esta llave para la implementación del mismo en cualquier servicio que requiera una conexión segura.

En este ejemplo vamos a crear una llave de 1024 bits.

openssl genrsa -out server.key 1024

Crear una llave privada

Crear un CSR (Certificate Signing Request)

Un CSR es la base para un certificado SSL, en el se definen datos como el dominio, organización, ubicación, información de contacto, entre otros.

Es importante destacar que estos pasos tambien son necesarios cuando vas a adquirir un certificado SSL de un proveedor autorizado, durante la gestión del mismo, el proveedor va a solicitar este archivo para crear tu certificado. Por lo tanto, debemos tener mucho cuidado en que la información que ingresamos sea correcta.

Si te equivocas no te preocupes, puedes generarlo las veces que quieras.

Para generar el CSR debes ejecutar el siguiente comando, si te fijas uno de los parámetros es la llave privada que acabamos de crear:

openssl req -new -key server.key -out server.csr

Crear un CSR

Al ejecutar este comando vendrán una serie de preguntas las cuales voy a explicar a continuación:

Country Name (2 letter code)

Código de país en formato ISO de dos letras.

State or Province Name (full name)

Estado o provincia.

Locality Name

Localidad o ciudad.

Organization Name

Nombre de la organización.

Organizational Unit Name

Sector de la organización.

Common Name

Nombre del dominio ó FQDN. Muy importante, hay una diferencia entre www.nanotutoriales.com a nanotutoriales.com sin www. Si registras tu certificado a una de estas opciones, no funcionará para el otro.

Email Address

Dirección de correo de contacto.

Si se fijan he dejado en blanco los campos A challenge password y An optional company name, no los vamos a necesitar.

Generando el certificado SSL

Para generar el certificado SSL vamos a necesitar tanto la llave privada como el CSR que acabamos de crear.

Para generar el certificado SSL debemos ejecutar el siguiente comando:

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Generando el certificado SSL

El parámetro days sirve para definir la fecha de expiración del certificado.

Configurar el certificado SSL en Apache

Si aún no has instalado Apache HTTP Server puedes visitar este nanotutorial.

Primero vamos a copiar los archivos a la carpeta /etc/ssl/certs.

sudo cp server.crt /etc/ssl/certs/ssl.crt
sudo cp server.key /etc/ssl/certs/ssl.key

Luego vamos a habilitar el módulo de SSL en Apache:

sudo a2enmod ssl

Configurar el certificado SSL en Apache

Ahora vamos a editar el archivo vhosts con el editor de texto nano. Si aún no conoces como trabajar con este editor, te invito a que visites este nanotutorial.

sudo nano /etc/apache2/sites-available/default-ssl

Borra todo el contenido del archivo, luego copia y pega lo siguiente:

<IfModule mod_ssl.c>
  <VirtualHost _default_:443>
    ServerName www.example.com
    ServerAdmin [email protected]
    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
      Options -Indexes FollowSymLinks MultiViews
      AllowOverride None
      Order allow,deny
      allow from all
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
    SSLEngine on
    SSLCertificateKeyFile /etc/ssl/certs/ssl.key
    SSLCertificateFile /etc/ssl/certs/ssl.crt
    #SSLCACertificateFile /etc/ssl/certs/bundle.crt
    BrowserMatch "MSIE [2-6]" \
      nokeepalive ssl-unclean-shutdown \
      downgrade-1.0 force-response-1.0
    # MSIE 7 and newer should be able to use keepalive
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
  </VirtualHost>
</IfModule>

No olvides sustituir www.example.com por tu dominio.

Una vez configurado el certificado en el archivo vhost, vamos a habilitarlo con el siguiente comando:

sudo a2ensite default-ssl

Configurar el certificado SSL en Apache

Para que la configuración tenga efecto, vamos a cargarla nuevamente. Para esto utilizaremos el siguiente comando:

sudo service apache2 reload

Configurar el certificado SSL en Apache

Bien, ahora tienen un certificado SSL configurado y funcionando.

Si en el paso anterior hay un error, puede encontrar el porque del error en el archivo /var/log/apache2/error.log.

Verificamos el certificado SSL desde un navegador

Una vez todo esta configurado, nos resta verificar la url desde nuestro navegador. Para esto vamos a escribir https:// seguido del dominio que hemos configurado en el certificado.

Verificamos el certificado SSL desde un navegador

La primera vez que ingresemos nos va a dar una alerta de que el certificado no es de confianza, esto es por no encontrar una identificacion de un proveedor autorizado.

Da clic en Entiendo el riesgo y luego en Anadir una excepcion.

Verificamos el certificado SSL desde un navegador

En la pantalla anterior da clic en Confirmar excepcion de seguridad y listo, la comunicacion con tu dominio es segura (siempre y cuando la conexión se mantenga bajo https://), podrás observar el candado en la barra de navegación que lo confirma.

Verificamos el certificado SSL desde un navegador

Si das clic en el candado podrás encontrar mas información acerca de el certificado, como por ejemplo: dónde aparece toda la información que ingresaste en el CSR.

Verificamos el certificado SSL desde un navegador


Acerca del autor

Hugo Gilmar Erazo Full Stack Web Developer

Soy un desarrollador web con más de 10 años de experiencia. Me considero fanático de GNU/Linux, lo cual me ha permitido complementar mis conocimientos en el desarrollo web con la administración de servidores.

Aunque manejo todo lo relacionado al Front-End, me inclino más por el desarrollo Back-End. También desarrollo aplicaciones móviles híbridas. Me gusta lo que hago.

Compartir este artículo