Cómo crear un certificado SSL autofirmado para Nginx en Ubuntu 18.04

SSL significa “Secure Sockets Layer”, que es la tecnología de seguridad estándar destinada a crear un enlace cifrado entre un servidor web y un navegador web. Este enlace garantiza que toda la información que se transmite entre el servidor y el navegador permanece privada y segura. El objetivo principal de los certificados SSL es garantizar la seguridad del sitio web y cifrar los datos transferidos entre el cliente y el navegador para evitar el robo de información confidencial, como datos de tarjetas de crédito, números de cuenta y contraseñas, etc.

Un certificado autofirmado es un certificado firmado por la persona que lo crea en lugar de una autoridad de certificación (CA) de confianza. La mayoría de los clientes y organizaciones se ven tentados a utilizar certificados SSL autofirmados en lugar de los emitidos y verificados por una autoridad certificadora de confianza, principalmente debido a la diferencia de costo. Pero todavía ofrece el mismo nivel de cifrado hasta un límite.

En este artículo, explicaré cómo crear un certificado SSL autofirmado en un servidor Ubuntu 18.04 con un servidor web Nginx.

Prerrequisitos

Un servidor bien configurado con privilegios de root y biblioteca OpenSSL. Se requiere la biblioteca OpenSSL para generar su propio certificado. Ejecute el siguiente comando en su servidor ubuntu para ver si ya tiene OpenSSL instalado.

# which openssl
/usr/bin/openssl

Si el comando which no devolvió el binario, entonces tendremos que instalarlo usando el comando:

#apt install openssl

Creación del certificado autofirmado

SSL consta principalmente de dos partes, una es la clave privada y la otra el certificado público. La clave SSL se mantiene privada en el servidor restringida al usuario root. En realidad, se utiliza para cifrar el contenido enviado a los clientes. El certificado SSL público se comparte con cualquiera que solicite el contenido. Se puede utilizar para descifrar el contenido firmado por la clave privada SSL asociada. Aquí, estoy usando este comando para generar un certificado autofirmado, a saber example.com.crt y una clave privada example.com.key (aquí estoy usando example.com.pem como nombre de archivo) con la herramienta OpenSSL.

#sobreenssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/example.com.key -out /etc/ssl/certs/example.com.pem

Consulte los detalles de cada opción a continuación:

  • req: este subcomando se utiliza para crear un nuevo certificado X.509. El “X.509” es un estándar de infraestructura de clave pública al que se adhieren SSL y TLS para su gestión de claves y certificados.
  • -x509: Esto modifica aún más el subcomando anterior diciéndole a la utilidad que queremos crear un certificado autofirmado.
  • -nodes: Esto se usa para omitir la opción de frase de contraseña para asegurar nuestro certificado.
  • -días 365: esta opción establece la validez del certificado en días. Lo estamos estableciendo por un año aquí.
  • -newkey rsa: 2048: Esto especifica que queremos generar una nueva clave RSA con 2048 bits junto con el certificado.
  • -keyout: esta opción le dice a OpenSSL dónde colocar el archivo de clave privada generado.
  • -out: esta opción le dice a OpenSSL dónde colocar el certificado generado.

Durante la ejecución de este comando, nos pedirá que proporcionemos los detalles del dominio / cliente para generar una Solicitud de firma de certificado (CSR). Puede proporcionar estos detalles según sea necesario.

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:Victoria
Locality Name (eg, city) []:Melbourne
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Linoxide LLC
Organizational Unit Name (eg, section) []:Web
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:[email protected]

Ahora tenemos nuestro certificado autofirmado recién generado y la clave privada son estas ubicaciones, a saber: /etc/ssl/certs/example.com.pem y /etc/ssl/private/example.com.key. A continuación, deberíamos crear un grupo Diffie-Hellman fuerte, que se utiliza en la negociación de Perfect Forward Secrecy con los clientes. Puede ejecutar este comando para crear uno.

#openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Esto puede llevar algo de tiempo en completarse, pero cuando esté listo tendremos un fuerte grupo de DH en /etc/ssl/certs/dhparam.pem que podemos usar en nuestra configuración.

Configuración de Nginx para usar certificados autofirmados

Antes de comenzar, debemos asegurarnos de que el servidor web Nginx esté instalado en nuestro servidor Ubuntu 18.04. Si no está instalado, puede instalarlo usando este simple comando:

#apt install nginx

He instalado y habilitado este servicio en mi servidor.

# nginx -v
nginx version: nginx/1.14.0 (Ubuntu)

#systemctl enable nginx
#systemctl start nginx
#systemctl status nginx

Próximo. podemos configurar Nginx para usar SSL. Lo explicaré en tres pasos:

  1. Crear una configuración de fragmento con los detalles del certificado SSL generado.
  2. Creación de una configuración de fragmento para mantener una configuración SSL fuerte y segura que supere posibles vulnerabilidades de SSL.
  3. Actualización del host virtual del dominio con las configuraciones de fragmentos anteriores para habilitar SSL

Paso 1: crear una configuración de fragmento con los detalles del certificado SSL

Creemos un nuevo archivo de configuración de fragmentos llamado “self-signing.conf” para señalar los detalles de nuestro certificado autofirmado generado dentro de la carpeta de fragmentos de Nginx: /etc/nginx/snippets/ como a continuación:

# cat /etc/nginx/snippets/self-signed.conf
# Self signed certificates generated by the ssl-cert package
# Don't use them in a production server!

ssl_certificate /etc/ssl/certs/example.com.pem;
ssl_certificate_key /etc/ssl/private/example.com.key;

Aquí necesitamos especificar nuestra ruta de certificado generada:/etc/ssl/certs/example.com.pem y ruta clave: /etc/ssl/private/example.com.key para la directiva como se mencionó anteriormente.

Paso 2: Creación de una configuración de fragmento para mantener la configuración de SSL fuerte y segura superando posibles vulnerabilidades de SSL

En segundo lugar, debemos mantener una configuración de servidor SSL sólida y completamente funcional que proteja nuestro servidor de todas las posibles vulnerabilidades de SSL. Configuré mi Nginx con un sólido conjunto de cifrado SSL y habilité algunas funciones avanzadas para garantizar la seguridad del servidor. Todos estos parámetros están incluidos en el archivo: /etc/nginx/snippets/ssl-params.conf

cat /etc/nginx/snippets/ssl-params.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling off;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

Puede obtener estas recomendaciones de cifrado Nginx en el Lista de cifrado. Estos parámetros se utilizarán en futuras configuraciones de Nginx para SSL. Como puede ver, hemos establecido el ssl_dhparam ajuste para apuntar al archivo Diffie-Hellman que generamos anteriormente aquí. Dado que estamos utilizando un certificado autofirmado, el SSL stapling no se utilizará. Por lo tanto, lo he convertido off o de lo contrario, Nginx simplemente generará una advertencia como esta nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate. Después de realizar estos cambios, puede guardar la configuración y salir.

Paso 3: Actualización del host virtual del dominio con las configuraciones de fragmentos anteriores para habilitar SSL

Estamos listos con nuestra configuración de fragmentos requerida, ahora podemos incluirlos en nuestro host virtual de dominio y habilitar SSL. Aquí en este artículo, estoy usando el archivo de configuración predeterminado de Nginx ubicado en /etc/nginx/sites-available/default. Modifiqué este archivo para habilitar SSL y recuperar los certificados autofirmados generados. Consulte la sección modificada a continuación en esta configuración:

cat /etc/nginx/sites-available/default

#
server {
listen 80 default_server;
listen [::]:80 default_server;

# SSL configuration

listen 443 ssl default_server;
listen [::]:443 ssl default_server;

#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
include snippets/self-signed.conf;
include snippets/ssl-params.conf;

Ahora podemos guardar estas configuraciones y reiniciar el servicio Nginx para que estos cambios sean efectivos.

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
#systemctl restart nginx

Pruebas

Este es nuestro paso final, donde podemos abrir nuestro navegador e intentar acceder a la IP de nuestro servidor en la URL >> https://Server_IP or Hostname. Mostrará una advertencia de seguridad ya que estamos usando un certificado autofirmado, puede ignorar esa advertencia y hacer clic para confirmar la seguridad para continuar, como se muestra en la instantánea.

Leer también:

  • Mkcert: cree certificados SSL para desarrollo local en Linux
  • Cómo instalar certificados SSL Let’s Encrypt en Ubuntu 18.04
  • Cómo configurar NGINX como proxy inverso usando Docker

¡Eso es todo! Hemos configurado correctamente Nginx con certificado autofirmado utilizando métodos de cifrado sólidos para conexiones seguras de clientes. ¡Espero que este artículo te sea de utilidad! Publique sus valiosos comentarios y sugerencias al respecto.