GNU/Linux >> Tutoriales Linux >  >> Ubuntu

Habilite correctamente HTTPS en Nginx con Let's Encrypt en Ubuntu

Este tutorial le muestra cómo habilitar correctamente HTTPS en Nginx con Let's Encrypt en Ubuntu. Google Chrome y Firefox ya han comenzado a marcar las páginas web no cifradas con un cuadro de entrada de contraseña como inseguras. Eventualmente, todas las páginas web HTTP se marcarán como no seguras. HTTPS se convertirá en predeterminado para cualquier sitio web. También es un requisito si desea utilizar el protocolo HTTP/2 para acelerar su sitio web.

Let's Encrypt es una autoridad de certificación gratuita, automatizada y abierta. La documentación oficial describe pasos simples que puede seguir para habilitar HTTPS con Let's Encrypt, pero hay más que eso. Si sigue el documento oficial, obtiene una puntuación A en la prueba de SSL Labs. Si sigues mis pasos, obtendrás A+ puntaje. Si ya implementó un certificado Let's Encrypt anteriormente, aún puede seguir este tutorial para renovar y reemplazar su certificado existente.

Este tutorial se divide en 3 partes.

  1. La primera parte trata sobre registro CAA, encabezados de seguridad y grapado OCSP . Estas cosas son las que pueden ayudarte a obtener A+ .
  2. La segunda parte se trata de redirigir el dominio www a un dominio que no sea www y viceversa.
  3. Te mostraré cómo manejar el servicio CloudFlare CDN en la tercera parte.

Nota:este tutorial funciona en todas las versiones actuales de Nginx y Ubuntu (incluidas 16.04, 18.04 y 20.04).

Creación de un registro CAA para su nombre de dominio

La autorización de la autoridad de certificación (CAA) es un registro de recursos de DNS que especifica qué autoridades de certificación (CA) pueden emitir un certificado para un nombre de dominio en particular. A partir de septiembre de 2017, todas las CA tienen la obligación de verificar los registros de CAA antes de emitir un certificado para un nombre de dominio en particular. Si no se encuentra ningún registro CAA para un nombre de dominio, cualquier CA puede emitir un certificado para ese nombre de dominio. Si una CA no figura en su registro de CAA, entonces esa CA no puede emitir un certificado para su nombre de dominio.

Para crear un registro CAA que permita a Let's Encrypt emitir un certificado para su nombre de dominio, agregue la siguiente entrada en su servidor DNS o administrador de DNS.

example.com. IN CAA 0 issue "letsencrypt.org"

También puede usar iodef para hacer que la CA informe solicitud de emisión de certificado malicioso a su dirección de correo electrónico.

example.com. IN CAA 0 iodef "mailto:your-email-address"

El formato de los registros anteriores es para archivos de zona. A continuación hay algunos consejos para usted.

  • Puede usar SSLMate CAA Record Helper para generar un registro CCA para su nombre de dominio.
  • Si está utilizando GoDaddy DNS, siga esta publicación para agregar un registro CAA.

Puede usar el siguiente comando de excavación para verificar su registro CAA.

dig example.com CAA

Tenga en cuenta que los navegadores web no verifican los registros CAA.

Encabezados de seguridad

Los encabezados de seguridad son tan importantes como el protocolo HTTPS, pero solo un pequeño porcentaje de los sitios habilitados para HTTPS prestan atención a los encabezados de seguridad. Si bien una discusión completa sobre los encabezados de seguridad está más allá del alcance de este tutorial, hablaré sobre las solicitudes de actualización inseguras y HSTS encabezados, porque puede habilitarlos fácilmente con Let's Encrypt para aumentar la seguridad de su sitio web.

Solicitudes inseguras de actualización

Hay momentos en que un sitio ha habilitado HTTPS, pero algunos CSS, imágenes o JavaScript todavía se sirven a través de HTTP. En este caso, el candado verde al principio de la barra de direcciones del navegador desaparecerá. En Google Chrome, se reemplaza con un ícono de información; En Firefox, se reemplaza con un candado gris con un triángulo amarillo. Querrá mostrar un candado verde a los visitantes del sitio con la mayor frecuencia posible y la manera fácil de solucionar este problema es habilitar las solicitudes inseguras de actualización. encabezado, lo que obligará a los navegadores web a usar https:// por cada http:// recurso.

Para habilitar este encabezado, simplemente agregue --uir bandera al emitir certbot dominio. Tenga en cuenta que este encabezado funciona en recursos alojados en su propio dominio y recursos en dominios de terceros que admiten HTTPS. Si su página web incluye recursos en servidores de terceros que no están disponibles a través de HTTPS, los navegadores web bloquearán esos recursos, pero el uso de este encabezado garantiza que sus páginas web siempre tengan un candado verde.

HSTS (Seguridad de transporte estricta HTTP)

El encabezado HSTS les dice a los navegadores web que toda la comunicación con su sitio web debe realizarse a través de HTTPS. Se defiende contra SSL Striping, que es un ataque para degradar de HTTPS a HTTP. Para habilitar este encabezado, simplemente agregue --hsts bandera al emitir certbot comando.

Grapado OCSP

Cuando un navegador web se conecta a un sitio web HTTPS, envía una solicitud OCSP (Protocolo de estado de certificado en línea) a la autoridad de certificación (CA) para consultar el estado de revocación del certificado SSL del sitio web. Esto puede retrasar la carga de la página entre 1 y 3 segundos, según los datos de telemetría de Firefox.

Para mejorar el rendimiento, el propietario del sitio web puede habilitar el engrapado OCSP, en cuyo caso el propio servidor web obtiene la respuesta OCSP firmada por CA a intervalos regulares. Cuando un navegador web se conecta al sitio, Nginx puede enviar la respuesta OCSP almacenada en caché al navegador web, eliminando así la necesidad de que el navegador web se comunique con el servidor OCSP.

Para habilitar el grapado OCSP, simplemente agregue --staple-ocsp bandera al emitir certbot comando.

OCSP debe grapar

Si un pirata informático crea un sitio web falso y duplicado, desactiva el elemento básico OCSP y también bloquea el acceso del navegador web al servidor OCSP, entonces el navegador web asumirá que está bien y procederá al sitio web malicioso. Para resolver este problema, puede habilitar OCSP debe grapar en su sitio web, que le dice a los navegadores web que su sitio web debe presentar una respuesta básica OCSP durante la conexión HTTPS. Entonces, cuando los navegadores web se conectan a un sitio web falso que no tiene un elemento básico OCSP, detendrá la conexión.

Para habilitar OCSP debe grapar, agregue --must-staple bandera al emitir certbot comando.

Instalación del cliente Let's Encrypt (Certbot) en Ubuntu

Ahora es el momento de ensuciarse las manos. A partir de Ubuntu 16.04, el cliente Let's Encrypt (Certbot) está incluido en el repositorio de Ubuntu, por lo que puede instalarlo con el siguiente comando. Python3-certbot-nginx es el complemento de Certbot Nginx.

sudo apt install certbot python3-certbot-nginx

Para comprobar el número de versión, ejecute

certbot --version

Salida de muestra:

certbot 0.31.0

Si desea utilizar la última versión, puede instalar Certbot desde la tienda Snap.

sudo apt install snapd

sudo snap install --classic certbot

Nota :si desea utilizar la versión Snap, debe utilizar la ruta binaria completa:/snap/bin/certbot .

Uso del complemento Certbot Nginx para habilitar HTTPS

Si su sitio web no utiliza el servicio CDN, se recomienda utilizar el complemento Nginx para habilitar HTTPS en el servidor web Nginx, ya que puede obtener automáticamente el certificado SSL/TLS y configurarlo por usted. Ejecute el siguiente comando en su servidor Ubuntu.

sudo certbot --nginx --agree-tos --redirect --uir --hsts --staple-ocsp --must-staple -d www.example.com,example.com --email [email protected]

donde:

  • --nginx :utilice el autenticador y el instalador de Nginx
  • --agree-tos :Acepto los términos de servicio de Let's Encrypt
  • --redirect :Agregar redirección 301.
  • --uir :agregue el encabezado "Content-Security-Policy:upgrade-insecure-requests" a cada respuesta HTTP.
  • --hsts :agregue el encabezado Strict-Transport-Security a cada respuesta HTTP.
  • --staple-ocsp :Habilita el grapado OCSP.
  • --must-staple :Agrega la extensión OCSP Must Staple al certificado.
  • -d va seguido de una lista de nombres de dominio, separados por comas. Puede agregar hasta 100 nombres de dominio.
  • --email :Correo electrónico utilizado para el registro y el contacto de recuperación.

Se le preguntará si desea recibir correos electrónicos de EFF (Electronic Frontier Foundation). Después de elegir S o N, su certificado SSL se obtendrá y configurará automáticamente para usted, lo cual se indica en el mensaje a continuación.

  • /etc/letsencrypt/live/example.com/fullchain.pem :la cadena completa del certificado de CA raíz, el certificado de CA intermedio y su certificado de servidor.
  • /etc/letsencrypt/live/example.com/privkey.pem :la clave privada de su servidor

Ahora, si visita su sitio web, puede ver que HTTP se redirige automáticamente a la conexión HTTPS. Resulta que el complemento Nginx actualmente no es compatible con --uir bandera. Para agregar manualmente el encabezado de solicitudes de actualización inseguras, edite el archivo de bloqueo del servidor Nginx.

sudo nano /etc/nginx/conf.d/example.com.conf

Agregue la siguiente línea en el bloque del servidor SSL.

add_header Content-Security-Policy upgrade-insecure-requests;

También es una buena idea agregar un solucionador de DNS en el bloque del servidor SSL.

resolver 8.8.8.8;

Si no agrega un solucionador, es posible que vea el siguiente mensaje en el registro de errores de Nginx.

[warn] 559#559: no resolver defined to resolve ocsp.int-x3.letsencrypt.org while requesting certificate status, responder: ocsp.int-x3.letsencrypt.org

Guarde y cierre el archivo. Luego, vuelva a cargar Nginx para que los cambios surtan efecto.

sudo systemctl reload nginx

Consejo para solucionar problemas

Si ve los siguientes mensajes de error al ejecutar el comando certbot, simplemente necesita ejecutar el comando certbot nuevamente, ya que es una falla temporal en la resolución de DNS.

An unexpected error occurred:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 159, in _new_conn
    conn = connection.create_connection(
  File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 61, in create_connection
    for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
  File "/usr/lib/python3.8/socket.py", line 918, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -3] Temporary failure in name resolution

Prueba de su certificado SSL

Vaya a ssllabs.com para probar su certificado y configuración SSL. Como prometí, obtienes A+ . También puede verificar si su nombre de dominio ha habilitado el registro CAA, si su servidor ha habilitado HSTS, grapado OCSP y grapado OCSP.

Redirigir WWW a No-WWW (o viceversa)

Ya hemos habilitado la redirección de HTTP a HTTPS, lo que queda por hacer es redirigir www a no-www, o viceversa. Si estás usando WordPress, entonces es muy fácil. Simplemente vaya a Panel de control de WordPress> Configuración> Generales y configure su versión preferida (www o no www) en Dirección de WordPress y Dirección del sitio .

Si sigue esa ruta, terminará con lo que se conoce como doble redirección 301. Primero, el servidor Nginx redirige HTTP a HTTPS, luego WordPress redirige a un dominio www o no www. Algunos pueden argumentar que la doble redirección 301 puede dañar el SEO de su sitio. Si le preocupa eso, puede usar el método a continuación para hacer que todas las versiones del dominio vayan directamente al destino final.

Edite su bloque de servidor Nginx.

sudo nano /etc/nginx/conf.d/example.com.conf

El cliente de CertBot agregó las siguientes líneas al archivo para redirigir HTTP a HTTPS.

if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot

Puede eliminar esas 3 líneas y editar las configuraciones de bloqueo de su servidor como la captura de pantalla a continuación para redirigir un dominio que no sea www a www.

  • El primer bloque de servidor escucha en el puerto 80.  Contiene una redirección 301 para redirigir HTTP a HTTPS.
  • El segundo bloque de servidor escucha en el puerto 443. Contiene una redirección 301 para redirigir dominios que no son www a www.

Si desea redirigir www a un dominio que no sea www, cambie

return 301 https://www.example.com$request_uri;

a

return 301 https://example.com$request_uri;

Y cambie el server_name directiva en los bloques del servidor SSL.

Guarde y cierre el archivo. Pruebe las configuraciones de Nginx.

sudo nginx -t

Si la prueba es exitosa, vuelva a cargar Nginx para que los cambios surtan efecto.

sudo systemctl reload nginx

Si está utilizando WordPress, asegúrese de configurar su versión de dominio preferida en Dirección de WordPress y Dirección del sitio antes de editar el archivo de configuración del bloque del servidor Nginx. Si la configuración de WordPress contradice la configuración de Nginx, su sitio estará en un bucle de redireccionamiento.

Cómo habilitar el protocolo HTTP/2

Para habilitar el protocolo HTTP/2 en Nginx, simplemente abra su archivo de host virtual Nginx y busque la siguiente línea.

listen 443 ssl;

Agregar http2 al final.

listen 443 ssl http2;

Guarde y cierre el archivo. Luego recarga Nginx.

sudo systemctl reload nginx

Cómo deshabilitar TLSv1 y TLSv1.1

TLSv1 y TLSv1.1 ya no se consideran seguros. A partir del 31 de enero de 2020, SSL Labs está limitando los servidores que admiten TLS 1.0 o TLS 1.1 a B grado. Para deshabilitarlos, edite el archivo de configuración de opciones SSL de Let's Encrypt.

sudo nano /etc/letsencrypt/options-ssl-nginx.conf

Busque la siguiente línea.

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Elimina las versiones de TLS eliminadas.

ssl_protocols TLSv1.2

Guarde y cierre el archivo. Luego reinicie Nginx.

sudo systemctl restart nginx

Cómo habilitar TLS 1.3

Lea el siguiente artículo:

  • Cómo habilitar fácilmente TLS 1.3 en Nginx en Ubuntu 20.04, 18.04, 16.04

Cómo habilitar IPv6 en Nginx

Si su servidor tiene una dirección IPv6 y su nombre de dominio tiene un registro AAAA, entonces debe habilitar IPv6 en Nginx. Agregue la siguiente línea en el bloque del servidor HTTP.

listen [::]:80;

Y agregue la siguiente línea en el bloque del servidor HTTPS.

listen [::]:443 ssl http2;

Guarde y cierre el archivo. Vuelva a cargar Nginx y listo.

sudo systemctl reload nginx

Renovación automática de certificados

Para renovar automáticamente el certificado de Let's Encrypt, simplemente edite el archivo crontab del usuario raíz.

sudo crontab -e

Luego agregue la siguiente línea en la parte inferior.

@daily certbot renew --quiet && systemctl reload nginx

--quiet bandera suprimirá la salida estándar. Si desea recibir un error estándar, agregue la siguiente línea al comienzo del archivo crontab.

MAILTO=[email protected]

Es necesario volver a cargar Nginx para que presente el nuevo certificado a los clientes.

Configuración de RUTA en Crontab

A veces, Cron me envía el siguiente mensaje, que también se puede ver en /var/log/letsencrypt/letsencrypt.log archivo.

Could not choose appropriate plugin for updaters: The nginx plugin is not working; there may be problems with your existing configuration.
The error was: NoInstallationError()

La causa de este error es que, de forma predeterminada, la RUTA en Cron está configurada en

PATH=/usr/bin:/bin

Pero el binario nginx se encuentra en /usr/sbin/nginx , Cron no puede encontrarlo con la RUTA predeterminada. Para corregir este error, agregue la siguiente línea al principio del archivo Crontab.

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

CDN de CloudFlare

Si desea instalar el certificado Let's Encrypt en su servidor y, al mismo tiempo, usar el servicio CDN de CloudFlare, deberá habilitar Universal SSL de CloudFlare en su sitio, lo que significa que

  • Las conexiones entre los visitantes del sitio y el servidor perimetral de CloudFlare se cifran mediante el certificado SSL universal de CloudFlare
  • Las conexiones entre su servidor de origen y el servidor perimetral de CloudFlare se cifran mediante el certificado emitido por Let's Encrypt.

Si instala el certificado Let's Encrypt en su servidor de origen y redirige HTTP a HTTPS, pero desactiva CloudFlare Universal SSL, los navegadores web se quejarán de que su sitio web está en un ciclo de redireccionamiento infinito porque CloudFlare redirige HTTPS a HTTP cuando Universal SSL no está habilitado.

Lo segundo que debe saber es que si desea habilitar el registro CAA mientras usa CloudFlare Universal SSL, también debe crear el siguiente registro CAA.

example.com. IN CAA 0 issue "comodoca.com"

example.com. IN CAA 0 issue "digicert.com"

example.com. IN CAA 0 issue "globalsign.com

Siga esta publicación para agregar un registro CAA para el certificado SSL universal de CloudFlare.

Entonces, ¿cómo haces para instalar el certificado Let's Encrypt con CloudFlare? Bueno, hay dos escenarios.

  1. Ya instaló el certificado Let's Encrypt siguiendo los pasos anteriores, ahora desea habilitar el servicio CloudFlare CDN.
  2. Su sitio web está utilizando el servicio CloudFlare CDN, ahora desea instalar el certificado Let's Encrypt en su servidor de origen.

El primer escenario

Si se encuentra en el primer escenario, puede continuar y habilitar el servicio CloudFlare CDN y también habilitar CloudFlare Universal SSL en CloudFlare Dashboard yendo a Crypto> SSL y seleccionando Completo (estricto) . Su sitio funcionará bien sin ningún problema.

El segundo escenario

Si usa CloudFlare CDN y ahora desea instalar Let's Encrypt en su servidor de origen, ejecute el siguiente comando para obtener e instalar el certificado TLS de Let's Encrypt.

sudo certbot --nginx --agree-tos --redirect --uir --hsts --staple-ocsp --must-staple -d www.example.com,example.com --email [email protected]

Después de obtener e instalar el certificado en su servidor, vaya al panel de control de Cloudflare y habilite CloudFlare Universal SSL.

Siguiente paso

Espero que este tutorial te haya ayudado a habilitar HTTPS en Nginx con Let's Encrypt en Ubuntu . También es posible que desee configurar el cortafuegos de la aplicación web ModSecurity para proteger su sitio de WordPress de la piratería.

  • Cómo configurar ModSecurity con Nginx en Debian/Ubuntu

Como siempre, si esta publicación le resultó útil, suscríbase a nuestro boletín informativo gratuito para obtener más consejos y trucos. Cuídate 🙂


Ubuntu
  1. Cómo proteger Nginx con Lets Encrypt en Ubuntu 20.04/18.04

  2. SSL gratis para Nginx en Centos por Let's encrypt

  3. Instale el certificado Let's Encrypt usando Certbot en Ubuntu 20.04 - ¿Cómo hacerlo en el servidor web Nginx?

  4. Asegure Nginx con Let's Encrypt en Ubuntu 18.04 - ¿Cómo hacerlo?

  5. Cómo proteger Nginx con Let's Encrypt en Ubuntu 20.04

Cómo instalar Nginx con Let's Encrypt SSL en Ubuntu 20.04 LTS

Proteja Nginx con el certificado Let's Encrypt SSL en Ubuntu 18.04

Cómo proteger Nginx con el certificado SSL de Let's Encrypt

Cómo proteger el servidor LEMP con Let's Encrypt Free SSL en Ubuntu 18.04 VPS

Cómo proteger Nginx con Let's Encrypt en Ubuntu 20.04

Cómo proteger Apache con Let's Encrypt en Ubuntu 20.04