diciembre 9, 2021

Cómo Crear un Certificado SSL Autofirmado para Apache en Ubuntu 16.04

Introducción

TLS, o transport layer security, y su predecesor SSL, que significa secure sockets layer, son protocolos web utilizados para envolver el tráfico normal en un contenedor protegido y cifrado.

Con 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 usarlo 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, dado que no está firmado por ninguna de las entidades de certificación de confianza incluidas en los navegadores web, los usuarios no pueden usar el certificado para validar automáticamente la identidad del servidor.

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 está orientada al usuario. Si tiene un nombre de dominio, en muchos casos es mejor usar un certificado firmado por CA. 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 privilegios sudo. Puede aprender a configurar dicha cuenta de usuario siguiendo nuestra configuración inicial del servidor para Ubuntu 16.04.

También necesitará tener instalado el servidor web Apache. Si desea instalar una pila completa de LAMP (Linux, Apache, MySQL, PHP) en su servidor, puede seguir nuestra guía para configurar LAMP en Ubuntu 16.04. Si solo desea el servidor web Apache, omita los pasos relacionados con PHP y MySQL en la guía.

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

Paso 1: Crear el certificado SSL

TLS / SSL funciona mediante una 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 cualquier persona 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 autofirmados 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 básica de línea de comandos para crear y administrar certificados, claves y otros archivos de OpenSSL.
  • req: Este subcomando especifica que queremos usar la administración de solicitud de firma de certificado (CSR) X. 509. El «X. 509» es un estándar de infraestructura de clave pública al que SSL y TLS se adhieren para su gestión de claves y certificados. Queremos crear un nuevo certificado X. 509, por lo que estamos usando este subcomando.
  • – x509: Esto modifica aún más el subcomando anterior al decirle a la utilidad que queremos hacer un certificado autofirmado en lugar de generar una solicitud de firma de certificado, como sucedería normalmente.
  • – nodos: Esto indica a OpenSSL que omita la opción de proteger nuestro certificado con una frase de contraseña. Necesitamos que Apache sea capaz de leer el archivo, sin intervención del usuario, cuando se inicia el servidor. Una frase de contraseña evitaría que esto sucediera porque tendríamos que introducirla después de cada reinicio.
  • – días 365: Esta opción establece el período de tiempo que el certificado se considerará válido. Lo fijamos para 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 crearla junto con el certificado. La porción rsa:2048 le dice que haga una clave RSA de 2048 bits de longitud.
  • – 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 dijimos anteriormente, estas opciones crearán un archivo de clave y un certificado. Se nos harán algunas preguntas sobre nuestro servidor para incrustar la información correctamente en el certificado.

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

La totalidad de las indicaciones se verá algo como esto:

Output
Country Name (2 letter code) :USState or Province Name (full name) :New YorkLocality Name (eg, city) :New York CityOrganization Name (eg, company) :Bouncy Castles, Inc.Organizational Unit Name (eg, section) :Ministry of Water SlidesCommon Name (e.g. server FQDN or YOUR name) :server_IP_addressEmail Address :admin@your_domain.com

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

Mientras usamos OpenSSL, también debemos crear un grupo Diffie-Hellman fuerte, que se utiliza para negociar el Secreto Directo Perfecto con los clientes.

Podemos hacer esto escribiendo:

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

Esto puede tardar unos minutos, pero cuando haya terminado, tendrá un grupo DH fuerte en /etc/ssl/certs/dhparam.pem que podemos usar en nuestra configuración.

Paso 2: Configurar Apache para usar SSL

Hemos creado nuestros archivos de claves y certificados en el directorio /etc/ssl. Ahora solo necesitamos modificar nuestra configuración de Apache para aprovecharlas.

Haremos algunos ajustes a nuestra configuración:

  1. Crearemos un fragmento de configuración para especificar una configuración SSL predeterminada sólida.
  2. Modificaremos el archivo de host virtual SSL Apache incluido para que apunte a nuestros certificados SSL generados.
  3. (Recomendado) Modificaremos el archivo de Host virtual sin cifrar para redirigir automáticamente las solicitudes al Host Virtual cifrado.

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

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

Primero, crearemos un fragmento de configuración de Apache para definir algunas configuraciones de SSL. Esto configurará Apache con un conjunto de cifrado SSL sólido y habilitará algunas funciones avanzadas que ayudarán a mantener nuestro servidor seguro. Los parámetros que estableceremos pueden ser utilizados por cualquier Host Virtual que habilite SSL.

Crear un nuevo fragmento de código en el directorio /etc/apache2/conf-available. Nombraremos el archivo ssl-params.conf para aclarar su propósito:

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

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

Los ajustes sugeridos en el sitio enlazado anteriormente ofrecen una gran seguridad. A veces, esto se produce a costa de una mayor compatibilidad con el cliente. Si necesita dar soporte a clientes más antiguos, hay una lista alternativa a la que se puede acceder haciendo clic en el enlace de la página etiquetado como «Sí, dame un cifrado que funcione con software antiguo / heredado.»Esa lista puede ser sustituida por los elementos copiados a continuación.

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

Para nuestros fines, podemos copiar la configuración proporcionada en su totalidad. Solo haremos dos pequeños cambios.

Establece la directiva SSLOpenSSLConfCmd DHParameters para que apunte al archivo Diffie-Hellman que generamos anteriormente. Además, tómese un momento para leer sobre la Seguridad de transporte Estricta HTTP, 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 accidentalmente o se habilita incorrectamente. En esta guía, no cargaremos previamente la configuración, pero puede modificarla si está seguro de comprender las implicaciones:

/etc/apache2/conf-available/ssl-params.conf
# from https://cipherli.st/# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.htmlSSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDHSSLProtocol All -SSLv2 -SSLv3SSLHonorCipherOrder 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 DENYHeader always set X-Content-Type-Options nosniff# Requires Apache >= 2.4SSLCompression off SSLSessionTickets OffSSLUseStapling on SSLStaplingCache "shmcb:logs/stapling-cache(150000)"SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"

Guarde y cierre el archivo cuando haya terminado.

Modifique el archivo de Host Virtual SSL de Apache predeterminado

A continuación, modifiquemos /etc/apache2/sites-available/default-ssl.conf, el archivo de Host virtual SSL de Apache predeterminado. Si está utilizando un archivo de bloque de servidor diferente, sustituya su nombre en los comandos a continuación.

Antes de continuar, hagamos una copia de seguridad del archivo de host virtual SSL original:

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

Ahora, abra el archivo de host virtual SSL para realizar 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 debería tener un aspecto similar a este de forma predeterminada:

/ 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 " \ # nokeepalive ssl-unclean-shutdown \ # downgrade-1.0 force-response-1.0 </VirtualHost></IfModule>

Haremos algunos ajustes menores en el archivo. Estableceremos las cosas normales que desearíamos ajustar en un archivo de Host Virtual (dirección de correo electrónico del servidor, nombre del servidor, etc.).), ajuste las directivas SSL para que apunten a nuestros archivos de certificados y claves, y descomente una sección que proporciona compatibilidad para navegadores más antiguos.

Después de realizar estos cambios, el bloque de servidor debería ser similar a este:

/etc/apache2/sites-available/default-ssl.conf
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin [email protected] 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 " \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 </VirtualHost></IfModule>

Guarde y cierre el archivo cuando haya terminado.

(Recomendado) Modifique el archivo de Host Virtual sin Cifrar para redirigir a HTTPS

En su estado actual, el servidor proporcionará tráfico HTTP sin cifrar y HTTPS cifrado. Para una mejor seguridad, se recomienda en la mayoría de los casos redirigir HTTP a HTTPS automáticamente. Si no desea o 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 a cifrado SSL, podemos abrir el archivo /etc/apache2/sites-available/000-default.conf :

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

Dentro, dentro de los bloques de configuración VirtualHost, solo necesitamos agregar una directiva Redirect, apuntando 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: Ajustar el cortafuegos

Si tiene el cortafuegos ufw habilitado, tal como se recomienda en las guías de requisitos previos, es posible que deba ajustar la configuración para permitir el tráfico SSL. Afortunadamente, Apache registra algunos perfiles con ufw tras la instalación.

Podemos ver los perfiles disponibles escribiendo:

  • sudo ufw app list

Deberías 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 anteriormente, su salida podría tener este aspecto:

Output
Status: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache (v6) ALLOW Anywhere (v6)

Para permitir adicionalmente el tráfico HTTPS, podemos permitir el perfil «Apache Completo» y luego eliminar la asignación de perfil redundante «Apache» :

  • sudo ufw allow 'Apache Full'
  • sudo ufw delete allow 'Apache'

Tu estado debería verse así ahora:

  • sudo ufw status
Output
Status: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereApache Full ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Apache Full (v6) ALLOW Anywhere (v6)

Paso 4: Habilitar los cambios en Apache

Ahora que hemos realizado nuestros cambios y ajustado nuestro firewall, podemos habilitar los módulos SSL y encabezados en Apache, habilitar nuestro Host virtual listo para SSL y reiniciar Apache.

Podemos habilitar mod_ssl, el módulo SSL de Apache y mod_headers, necesarios para algunas de las configuraciones de nuestro fragmento de código SSL, con el comando a2enmod :

  • sudo a2enmod ssl
  • sudo a2enmod headers

A continuación, podemos habilitar nuestro Host virtual SSL con el comando a2ensite :

  • sudo a2ensite default-ssl

También necesitaremos habilitar nuestro archivo ssl-params.conf para leer los valores que establecemos:

  • sudo a2enconf ssl-params

En este punto, nuestro sitio y los módulos necesarios están habilitados. Debemos verificar que no haya errores de sintaxis en nuestros archivos. Podemos hacer esto 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 messageSyntax OK

La primera línea es solo un mensaje que le indica que la directiva ServerName no está configurada globalmente. Si desea deshacerse de ese mensaje, puede establecer ServerName en el nombre de dominio o la dirección IP de su servidor en /etc/apache2/apache2.conf. Esto es opcional, ya que el mensaje no hará daño.

Si su salida tiene Syntax OK, su archivo de configuración no tiene errores de sintaxis. Podemos reiniciar Apache de forma segura para implementar nuestros cambios:

  • sudo systemctl restart apache2

Paso 5: Pruebe el cifrado

Ahora, estamos listos para probar nuestro servidor SSL.

Abra su navegador web y escriba https:// seguido del 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 de aspecto aterrador como la siguiente:

 Advertencia de certificado autofirmado de Apache

Esto es normal y esperado. Solo nos interesa el aspecto de cifrado de nuestro certificado, no la validación por terceros de la autenticidad de nuestro host. Haga clic en «AVANZADO» y luego en el enlace proporcionado para continuar con su anfitrión de todos modos:

Anulación con firma automática de Apache

Debería ser llevado a su sitio. Si miras en la barra de direcciones del navegador, verás un candado con una» x » encima. En este caso, esto solo significa que el certificado no se puede validar. Todavía está cifrando 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 el resultado es el mismo icono, significa que la redirección funcionó correctamente.

Paso 6: Cambie a una redirección permanente

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

Vuelva a abrir el archivo de configuración del bloque de servidor:

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

Encuentra la línea Redirect que agregamos anteriormente. Agregue permanent a esa línea, que cambia la redirección de una redirección temporal 302 a una redirección 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 si hay errores de sintaxis en su configuración:

  • sudo apache2ctl configtest

Cuando esté listo, reinicie Apache para que la redirección sea permanente:

  • sudo systemctl restart apache2

Conclusión

Ha configurado su servidor Apache para que utilice un cifrado sólido para las conexiones de cliente. Esto le permitirá enviar solicitudes de forma segura y evitará que terceros lean su tráfico.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.