Cómo crear un certificado SSL auto-firmado para Apache en Ubuntu 16.04

Introducción

TLS o seguridad de capa de transporte, y su predecesor SSL , que representa la capa de sockets seguros, son protocolos web usados ​​para envolver el tráfico normal en un contenedor protegido y encriptado.

Utilizando esta tecnología, los servidores pueden enviar tráfico de forma segura entre el servidor y los clientes sin la posibilidad de que los mensajes sean interceptados por terceros. El sistema de certificados también ayuda a los usuarios a verificar la identidad de los sitios con los que se conectan.

En esta guía, le mostraremos cómo configurar un certificado SSL autofirmado para su uso con un servidor web Apache en un servidor Ubuntu 16.04.

Nota: Un certificado autofirmado cifrará la comunicación entre su servidor y cualquier cliente. Sin embargo, debido a que no está firmado por ninguna de las autoridades de certificados de confianza incluidas en los exploradores web, los usuarios no pueden utilizar el certificado para validar la identidad de su servidor de forma automática.

Un certificado autofirmado puede ser apropiado si no tiene un nombre de dominio asociado con su servidor y para instancias en las que la interfaz web cifrada no es orientada al usuario. Si hacer tener un nombre de dominio, en muchos casos, es mejor utilizar un certificado firmado. Puede averiguar cómo configurar un certificado de confianza gratuito con el proyecto Let’s Encrypt aquí .

Requisitos previos

Antes de comenzar, debe tener un usuario no root configurado con sudoprivilegios. Puede aprender cómo configurar una cuenta de usuario de este tipo siguiendo nuestra configuración inicial de servidor para Ubuntu 16.04 .

También necesitará instalar el servidor web Apache. Si desea instalar una pila completa de LAMP (Linux, Apache, MySQL, PHP) en su servidor, puede seguir nuestra guía de configuración de LAMP en Ubuntu 16.04 . Si solo desea el servidor web Apache, salte los pasos referentes a PHP y MySQL en la guía.

Cuando haya completado los requisitos previos, continúe a continuación.

Paso 1: Cree el certificado SSL

TLS / SSL funciona mediante la combinación de un certificado público y una clave privada. La clave SSL se mantiene en secreto en el servidor. Se utiliza para cifrar el contenido enviado a los clientes. El certificado SSL se comparte públicamente con cualquiera que solicite el contenido. Se puede utilizar para descifrar el contenido firmado por la clave SSL asociada.

Podemos crear un par de claves y certificados auto-firmados con OpenSSL en un solo comando:

  • sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

Se le hará una serie de preguntas. Antes de repasar eso, echemos un vistazo a lo que está sucediendo en el comando que estamos emitiendo:

  • openssl : Esta es la herramienta de línea de comandos básica para crear y administrar certificados, claves y otros archivos de OpenSSL.
  • req : Este subcomando especifica que queremos utilizar la gestión de solicitudes de firma de certificados X.509 (CSR). El “X.509” es un estándar de infraestructura de clave pública que SSL y TLS cumplen con su gestión de claves y certificados. Queremos crear un nuevo cert X.509, por lo que estamos utilizando este subcomando.
  • -x509 : Esto modifica aún más el subcomando anterior diciéndole a la utilidad que queremos hacer un certificado autofirmado en lugar de generar una solicitud de firma de certificado, como sucedería normalmente.
  • -nodes : Esto le dice a OpenSSL que omita la opción de proteger nuestro certificado con una contraseña. Necesitamos que Apache pueda leer el archivo, sin intervención del usuario, cuando el servidor se inicia. Una frase de contraseña evitaría que esto suceda porque tendríamos que entrar después de cada reinicio.
  • -days 365 : Esta opción establece el período de tiempo que el certificado se considerará válido. Lo establecimos por un año aquí.
  • -newkey rsa: 2048 : Especifica que queremos generar un nuevo certificado y una nueva clave al mismo tiempo. No creamos la clave que se requiere para firmar el certificado en un paso anterior, por lo que necesitamos crearlo junto con el certificado. La rsa:2048porción le dice que haga una clave RSA de 2048 bits.
  • -keyout : Esta línea indica a OpenSSL dónde colocar el archivo de clave privada generado que estamos creando.
  • -out : Esto indica a OpenSSL dónde colocar el certificado que estamos creando.

Como hemos dicho anteriormente, estas opciones crearán un archivo clave y un certificado. Se nos harán algunas preguntas sobre nuestro servidor para incrustar la información correctamente en el certificado.

Llene las indicaciones apropiadamente. La línea más importante es la que solicita la Common Name (e.g. server FQDN or YOUR name). Debe introducir el nombre de dominio asociado a su servidor o, más probablemente, la dirección IP pública de su servidor.

La totalidad de los mensajes se verá algo como esto:

Output
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com

Ambos archivos creados se colocarán en los subdirectorios apropiados del /etc/ssldirectorio.

Mientras usamos OpenSSL, también debemos crear un grupo fuerte de Diffie-Hellman, que se utiliza en la negociación de Perfect Forward Secrecy con los clientes.

Podemos hacerlo escribiendo:

  • sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Esto puede tomar algunos minutos, pero cuando se hace usted tendrá un fuerte grupo de DH en /etc/ssl/certs/dhparam.pemque podemos utilizar en nuestra configuración.

Paso 2: Configurar Apache para usar SSL

Hemos creado nuestros archivos de claves y certificados bajo el /etc/ssldirectorio. Ahora solo necesitamos modificar nuestra configuración de Apache para aprovechar estas ventajas.

Haremos algunos ajustes en nuestra configuración:

  1. Crearemos un fragmento de configuración para especificar la configuración SSL predeterminada fuerte.
  2. Modificaremos el archivo SSL Apache Virtual Host incluido para apuntar a nuestros certificados SSL generados.
  3. (Recomendado) Modificaremos el archivo de Host Virtual no encriptado para redirigir automáticamente las peticiones al Host Virtual cifrado.

Cuando hayamos terminado, deberíamos tener una configuración SSL segura.

Crear un fragmento de configuración de Apache con configuración de cifrado fuerte

En primer lugar, crearemos un fragmento de configuración de Apache para definir algunas configuraciones de SSL. Esto configurará a Apache con una sólida suite de cifrado SSL y activará algunas funciones avanzadas que ayudarán a mantener nuestro servidor seguro. Los parámetros que establezcamos pueden ser utilizados por cualquier host virtual habilitando SSL.

Cree un fragmento nuevo en el /etc/apache2/conf-availabledirectorio. Nombraremos el archivo ssl-params.confpara hacer su propósito claro:

  • sudo nano /etc/apache2/conf-available/ssl-params.conf

Para configurar de forma segura SSL de Apache, utilizaremos las recomendaciones de Remy van Elst en el sitio Cipherli.st . Este sitio está diseñado para proporcionar configuraciones de cifrado fáciles de consumir para el software popular. Puedes leer más acerca de sus decisiones con respecto a las opciones de Apache aquí .

La configuración sugerida en el sitio vinculado a lo anterior ofrece una fuerte seguridad. A veces, esto se produce a costa de una mayor compatibilidad con el cliente. Si necesita apoyar a clientes más viejos, hay una lista alternativa a la que se puede acceder haciendo clic en el vínculo de la página con la etiqueta “Sí, dame una suite de cifras que funciona con software antiguo / antiguo”. Esa lista puede ser sustituida por los artículos copiados a continuación.

La elección de la configuración que utilice dependerá en gran medida de lo que necesita para soportar. Ambos proporcionarán una gran seguridad.

Para nuestros propósitos, podemos copiar la configuración proporcionada en su totalidad. Sólo haremos dos pequeños cambios.

Establezca la SSLOpenSSLConfCmd DHParametersdirectiva para que apunte al archivo Diffie-Hellman que generamos anteriormente. Además, tómese un momento para leer en HTTP Strict Transport Security, o HSTS , y específicamente sobre la funcionalidad de “precarga” . La precarga de HSTS proporciona mayor seguridad, pero puede tener consecuencias de gran alcance si se habilita o habilita de forma incorrecta. En esta guía, no precargaremos la configuración, pero puede modificarla si está seguro de entender las implicaciones:

/etc/apache2/conf-available/ssl-params.conf
# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off 
SSLSessionTickets Off
SSLUseStapling on 
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"

Guarde y cierre el archivo cuando haya terminado.

Modificar el archivo de host virtual SSL Apache predeterminado

A continuación, modifique /etc/apache2/sites-available/default-ssl.confel archivo predeterminado de Apache SSL Virtual Host. Si está utilizando un archivo de bloque de servidor diferente, sustituya su nombre por los siguientes comandos.

Antes de seguir adelante, vamos a realizar una copia de seguridad del archivo SSL Virtual Host original:

  • sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

Ahora, abra el archivo SSL Virtual Host para hacer ajustes:

  • sudo nano /etc/apache2/sites-available/default-ssl.conf

En el interior, con la mayoría de los comentarios eliminados, el archivo de host virtual debe verse algo así por defecto:

/etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                # BrowserMatch "MSIE [2-6]" \
                #               nokeepalive ssl-unclean-shutdown \
                #               downgrade-1.0 force-response-1.0

        </VirtualHost>
</IfModule>

Haremos algunos ajustes menores en el archivo. Definiremos las cosas normales que queremos ajustar en un archivo de host virtual (dirección de correo electrónico de ServerAdmin, nombre de servidor, etc.), ajustar las directivas SSL para apuntar a nuestros archivos de certificados y claves y descomentar una sección que proporcione compatibilidad para usuarios antiguos navegadores

Después de realizar estos cambios, el bloque de servidor debe ser similar a esto:

/etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin your_email@example.com
                ServerName server_domain_or_IP

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt
                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                BrowserMatch "MSIE [2-6]" \
                               nokeepalive ssl-unclean-shutdown \
                               downgrade-1.0 force-response-1.0

        </VirtualHost>
</IfModule>

Guarde y cierre el archivo cuando haya terminado.

Tal y como está ahora, el servidor proporcionará HTTP sin cifrar y tráfico HTTPS cifrado. Para una mejor seguridad, se recomienda en la mayoría de los casos para redirigir HTTP a HTTPS automáticamente. Si no desea o no necesita esta funcionalidad, puede omitir esta sección de forma segura.

Para ajustar el archivo de host virtual sin cifrar para redirigir todo el tráfico para que se cifre SSL, podemos abrir el /etc/apache2/sites-available/000-default.confarchivo:

  • sudo nano /etc/apache2/sites-available/000-default.conf

Dentro, dentro de los VirtualHostbloques de configuración, sólo necesitamos agregar una Redirectdirectiva, señalando todo el tráfico a la versión SSL del sitio:

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
        . . .

        Redirect "/" "https://your_domain_or_IP/"

        . . .
</VirtualHost>

Guarde y cierre el archivo cuando haya terminado.

Paso 3: Ajuste el Firewall

Si el ufwfirewall está habilitado, tal como lo recomiendan las guías de requisitos previos, puede que tenga que ajustar la configuración para permitir el tráfico SSL. Afortunadamente, Apache registra algunos perfiles con ufwla instalación.

Podemos ver los perfiles disponibles escribiendo:

  • sudo ufw app list

Debería ver una lista como esta:

Output
Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

Puede ver la configuración actual escribiendo:

  • sudo ufw status

Si solo permitió el tráfico HTTP regular más temprano, su salida podría tener este aspecto:

Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache                     ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache (v6)                ALLOW       Anywhere (v6)

Para permitir además el tráfico HTTPS, podemos permitir que el “Apache Full” perfil y luego eliminar el redundante “Apache” perfil de concesión:

  • sudo ufw allow ‘Apache Full’
  • sudo ufw delete allow ‘Apache’

Tu estado debería verse así ahora:

  • sudo ufw status
Output
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache Full                ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache Full (v6)           ALLOW       Anywhere (v6)

Paso 4: Habilitar los cambios en Apache

Ahora que hemos hecho nuestros cambios y hemos ajustado nuestro cortafuegos, podemos habilitar los módulos SSL y encabezados en Apache, habilitar nuestro Host Virtual habilitado para SSL y reiniciar Apache.

Podemos habilitar mod_ssl, el módulo SSL de Apache y mod_headers, necesitados por algunas de las configuraciones de nuestro fragmento SSL, con el a2enmodcomando:

  • sudo a2enmod ssl
  • sudo a2enmod headers

A continuación, podemos habilitar nuestro Host Virtual SSL con el a2ensitecomando:

  • sudo a2ensite default-ssl

También necesitaremos habilitar nuestro ssl-params.confarchivo, para leer en los valores que establecemos:

  • sudo a2enconf ssl-params

En este punto, nuestro sitio y los módulos necesarios están habilitados. Deberíamos comprobar que no hay errores de sintaxis en nuestros archivos. Podemos hacerlo escribiendo:

  • sudo apache2ctl configtest

Si todo tiene éxito, obtendrá un resultado que se ve así:

Output
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

La primera línea es sólo un mensaje que indica que la ServerNamedirectiva no está definida globalmente. Si desea deshacerse de ese mensaje, puede establecer ServerNameel nombre de dominio o la dirección IP de su servidor en /etc/apache2/apache2.conf. Esto es opcional ya que el mensaje no causará daño.

Si su salida tiene Syntax OKen él, su archivo de configuración no tiene errores de sintaxis. Podemos reiniciar Apache con seguridad para implementar nuestros cambios:

  • sudo systemctl restart apache2

Paso 5: Prueba de cifrado

Ahora, estamos listos para probar nuestro servidor SSL.

Abra su navegador web y escriba https://seguido por el nombre de dominio o IP de su servidor en la barra de direcciones:

https://server_domain_or_IP

Debido a que el certificado que creamos no está firmado por una de las autoridades de certificación de confianza de su navegador, es probable que vea una advertencia similar a la que se muestra a continuación:

Esto es normal y esperado. Sólo estamos interesados ​​en el aspecto de cifrado de nuestro certificado, no en la validación por parte de terceros de la autenticidad de nuestro host. Haga clic en “AVANZADO” y luego el enlace proporcionado para proceder a su anfitrión de todos modos:

Usted debe ser llevado a su sitio. Si miras en la barra de direcciones del navegador, verás un bloqueo con una “x” sobre él. En este caso, esto significa que el certificado no puede ser validado. Todavía está encriptando su conexión.

Si configuró Apache para redirigir HTTP a HTTPS, también puede comprobar si la redirección funciona correctamente:

http://server_domain_or_IP

Si esto da como resultado el mismo icono, significa que su redirección funcionó correctamente.

Paso 6: Cambiar a un redireccionamiento permanente

Si su redirección funcionó correctamente y está seguro de que sólo desea permitir el tráfico cifrado, debe modificar de nuevo el servidor virtual sin apuntar de Apache para que la redirección sea permanente.

Abra de nuevo su archivo de configuración de bloque de servidor:

  • sudo nano /etc/apache2/sites-available/000-default.conf

Encuentre la Redirectlínea que hemos agregado anteriormente. Añadir permanenta esa línea, que cambia el redireccionamiento de un redireccionamiento temporal 302 a un redireccionamiento permanente 301:

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
        . . .

        Redirect permanent "/" "https://your_domain_or_IP/"

        . . .
</VirtualHost>

Guarde y cierre el archivo.

Compruebe la configuración de los errores de sintaxis:

  • sudo apache2ctl configtest

Cuando esté listo, reinicie Apache para que el redireccionamiento sea permanente:

  • sudo systemctl restart apache2

Conclusión

Ha configurado su servidor Apache para utilizar cifrado seguro para las conexiones de cliente. Esto le permitirá atender las solicitudes de forma segura y evitará que terceros puedan leer su tráfico.

Deja un comentario

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