# HSTS

> Envía Strict-Transport-Security desde el borde para que los navegadores usen siempre HTTPS en tus sitios, con subdominios y precarga.

**HTTP Strict Transport Security** (HSTS) indica a los navegadores que usen HTTPS en un sitio durante un tiempo, aunque alguien escriba `http://` o siga un enlace `http://`. El borde ya redirige HTTP a HTTPS; HSTS elimina esa primera petición sin cifrar.

## Cómo lo envía el borde

Cuando `hsts.max_age` es mayor que `0`, el borde añade esta cabecera a todas las respuestas HTTPS del sitio:

```http
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
```

- `includeSubDomains` solo aparece con `hsts.include_subdomains`, y `preload` solo con `hsts.preload`.
- La cabecera nunca se envía en respuestas por HTTP.
- Con HSTS activado, el valor del borde sustituye a cualquier cabecera `Strict-Transport-Security` de tu origen. Con HSTS desactivado (`max_age` `0`), la del origen pasa tal cual.

## Ajustes

| Ajuste | Valores | Por defecto |
|---|---|---|
| `hsts.max_age` | Segundos, de `0` a `63072000` (2 años). `0` = sin cabecera. | `0` |
| `hsts.include_subdomains` | `true` / `false` | `false` |
| `hsts.preload` | `true` / `false` | `false` |

Como el resto de ajustes del borde, HSTS se puede fijar para toda la zona o sustituir para un nombre (`hosts.<nombre>.hsts`).

## Actívalo

> **Atención**
>
> Los navegadores recuerdan HSTS durante todo el `max-age` tras cada visita. Empieza con una duración corta, asegúrate de que todas las páginas funcionan por HTTPS y súbela después. Con **Incluir subdominios**, todos los subdominios también deben funcionar por HTTPS.


**Panel**

En **SSL/TLS › Certificados › HSTS**, elige una **Duración** (1 día, 6 meses, 1 año o 2 años), activa **Incluir subdominios** y **Permitir precarga (preload)** si lo necesitas y pulsa **Guardar cambios**.

**CLI**

```sh
openwaf-cloud ctl zones set example.com hsts.max_age=86400 --reason "HSTS, 1 día para empezar"
openwaf-cloud ctl zones set example.com hsts.max_age=31536000 hsts.include_subdomains=true --reason "HSTS 1 año"
```

**API**

```sh
curl -s -X PATCH https://dash.openwaf.dev/v1/orgs/$ORG/zones/$ZONE/edge \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Change-Reason: HSTS 1 año" \
  -d '{"hsts": {"max_age": 31536000, "include_subdomains": true}}'
```

**MCP**

`update_settings` con `{"zone": "example.com", "settings": {"hsts": {"max_age": 31536000, "include_subdomains": true}}, "reason": "HSTS 1 año"}`, primero con `confirm=false` y después con `confirm=true` y `expected_version`.


Compruébalo:

```sh
curl -sI https://www.example.com/ | grep -i strict-transport-security
```

## Precarga

**Permitir precarga (preload)** añade la directiva `preload`, que permite enviar el dominio a la lista de precarga de HSTS integrada en los navegadores. Los navegadores exigen una duración de al menos 1 año con los subdominios incluidos.

> **Peligro**
>
> La precarga es muy difícil de deshacer. Cuando los navegadores publican la lista, sacar tu dominio puede tardar meses, y mientras tanto todos los subdominios deben servir HTTPS.


## Desactívalo

Pon `hsts.max_age` a `0` (**Duración › Desactivado**). Los navegadores que ya vieron la cabecera siguen usando HTTPS hasta que se agota el `max-age` que guardaron.
