Este tutorial le mostrará cómo habilitar correctamente HTTPS en Apache 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.
Como probablemente sepa, 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 sigues el documento oficial, obtendrás A en la prueba de SSL Labs. Si sigues mis pasos, obtendrás una puntuación A+ . Si ya implementó un certificado Let's Encrypt anteriormente, aún puede seguir este tutorial para renovar y reemplazar su certificado existente.
Antes de mostrarle los pasos para habilitar HTTPS con Let's Encrypt, primero quiero hablar sobre el registro CAA. encabezados de seguridad y grapado OCSP . Estas cosas son las que pueden ayudarte a obtener A+. También le mostraré cómo manejar el servicio CDN de CloudFlare al final de este tutorial.
Nota:este tutorial funciona en todas las versiones actuales de Apache 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 de una 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 comprobarán los registros CAA.
Encabezados de seguridad
Los encabezados de seguridad son tan importantes como 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, quiero 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.
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 tanto como sea posible y la manera fácil de solucionar este problema es habilitar solicitudes inseguras de actualización encabezado, que forzará al navegador 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 y la envía 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, lo 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-apache es el complemento de Certbot Apache.
sudo apt install certbot python3-certbot-apache
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 de Apache para habilitar HTTPS
Si su sitio web no utiliza el servicio CDN, se recomienda utilizar el complemento Apache para habilitar HTTPS en el servidor web Apache, ya que puede obtener automáticamente el certificado SSL/TLS y configurarlo por usted. Ejecute el siguiente comando en su servidor Ubuntu.
sudo certbot --apache --agree-tos --redirect --uir --hsts --staple-ocsp --must-staple -d www.example.com,example.com --email [email protected]
Explicación:
--apache
:use el autenticador e instalador de Apache--agree-tos
:Acepto los términos de servicio de Let's Encrypt--redirect
:redirigir automáticamente todo el tráfico HTTP a HTTPS--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.
Ahora, si visita su sitio web, puede ver que HTTP se redirige automáticamente a la conexión HTTPS. Tenga en cuenta que el cliente de certbot crea /etc/apache2/sites-enabled/example.com-le-ssl.conf Host virtual SSL al configurar SSL para su sitio web.
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 Apache redirige HTTP a HTTPS, luego WordPress redirige a un dominio www o no www.
Algunos pueden argumentar que puede perder el jugo del enlace SEO al hacer una doble redirección 301. 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 archivo de host virtual. (No el servidor virtual SSL)
sudo nano /etc/apache2/sites-enabled/example.com.conf
El cliente de CertBot agregó las siguientes líneas al archivo para redirigir HTTP a HTTPS.
RewriteEngine on RewriteCond %{SERVER_NAME} =example.com [OR] RewriteCond %{SERVER_NAME} =www.example.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
Para redirigir a un dominio www o no www, debe cambiar la última línea. Reemplazar %{SERVER_NAME}
con su versión de dominio preferida como se muestra a continuación. (dominio www)
RewriteRule ^ https://www.example.com%{REQUEST_URI} [END,NE,R=permanent]
Si prefiere un dominio que no sea www, cámbielo por el siguiente.
RewriteRule ^ https://example.com%{REQUEST_URI} [END,NE,R=permanent]
Luego guarde y cierre el archivo. También necesitaremos editar el servidor virtual SSL.
sudo nano /etc/apache2/sites-enabled/example.com-le-ssl.conf
Agregue las siguientes líneas sobre la etiqueta de cierre para redirigir un dominio que no sea www a www.
RewriteEngine on RewriteCond %{SERVER_NAME} =example.com RewriteRule ^ https://www.example.com%{REQUEST_URI} [END,NE,R=permanent]
Si desea redirigir www a un dominio que no sea www, agregue las siguientes líneas en su lugar.
RewriteEngine on RewriteCond %{SERVER_NAME} =www.example.com RewriteRule ^ https://example.com%{REQUEST_URI} [END,NE,R=permanent]
Guarde y cierre el archivo. Vuelva a cargar el servicio Apache para que los cambios surtan efecto.
sudo systemctl reload apache2
Para que quede más claro, a continuación se muestra una captura de pantalla de mi archivo de host virtual Apache y el archivo de host virtual SSL para redirigir un dominio que no sea www a www.
Archivo de host virtual de Apache
Archivo de host virtual Apache SSL
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 los archivos de host virtual de Apache. Si la configuración de WordPress contradice la configuración de Apache, su sitio estará en un bucle de redirección.
Cómo deshabilitar TLSv1 y TLSv1.1
TLSv1 y TLSv1.1 ya no se consideran seguros. Para deshabilitarlos, edite el archivo de configuración de opciones SSL de Let's Encrypt.
sudo nano /etc/letsencrypt/options-ssl-apache.conf
Busque la siguiente línea, que deshabilita SSLv2 y SSLv3 de forma predeterminada.
SSLProtocol all -SSLv2 -SSLv3
Cámbielo a lo siguiente para deshabilitar también TLSv1.0 y TLSv1.1.
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
Guarde y cierre el archivo. Luego reinicie Apache.
sudo systemctl restart apache2
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 apache2
--quiet
flag suprimirá los mensajes normales. Si desea recibir mensajes de error, agregue la siguiente línea al comienzo del archivo crontab.
MAILTO=your-email-address
Es necesario volver a cargar Apache para presentar el nuevo certificado a los clientes.
CDN de CloudFlare
Lo primero que debe saber es que 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 comunicaciones 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, redirige HTTP a HTTPS y 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.
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.
- Ya instaló el certificado Let's Encrypt siguiendo los pasos anteriores, ahora desea habilitar el servicio CloudFlare CDN.
- 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>
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 --apache --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 el host virtual de Apache 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 contra la piratería.
- Cómo configurar ModSecurity con Apache en Debian/Ubuntu
Para acelerar su sitio web, puede habilitar el protocolo HTTP/2 con Apache.
- Cómo habilitar el protocolo HTTP/2 con Apache en Ubuntu
Como siempre, si esta publicación le resultó útil, suscríbase a nuestro boletín informativo gratuito para obtener más tutoriales.