# OpenWAF Origin CA

> Certificados gratuitos para tus servidores de origen, de confianza para el borde en Full (strict). Clave generada o tu propia CSR, hasta 15 años.

La **OpenWAF Origin CA** es una autoridad de certificación gestionada por OpenWAF que emite certificados gratuitos para tus servidores de origen. El borde de OpenWAF confía en ella en [Full (strict)](https://developers.openwaf.dev/es/ssl/origin-tls/#full-strict), junto a las CA públicas. Los navegadores no confían en ella, y no lo necesitan: los visitantes solo ven el [certificado del borde](https://developers.openwaf.dev/es/ssl/edge-certificates/).

Usa un certificado de origen cuando:

- el origen no tiene certificado público o no quieres renovarlo cada pocos meses;
- el nombre que verifica el borde no resuelve al origen, o el origen no es accesible desde Internet, de modo que una CA pública no puede validarlo.

> **Atención**
>
> Usa los certificados de origen solo detrás del proxy de OpenWAF. Quien llegue al origen directamente recibirá un certificado en el que su navegador no confía.


## Qué puedes pedir

| Campo | Reglas | Por defecto |
|---|---|---|
| Nombres (`hostnames`) | De 1 a 100: la propia zona, nombres por debajo (`www.example.com`) o comodines `*.<nombre>` (`*.example.com`, `*.shop.example.com`). Nada fuera de la zona ni direcciones IP. Se pasan a minúsculas y sin repetir. | — |
| Clave (`key_type`) | `ecdsa_p256` o `rsa2048`, generada por OpenWAF, **o** tu propia CSR (`csr`). | `ecdsa_p256` |
| CSR (`csr`) | Una solicitud de certificado en PEM hecha en tu servidor, con una clave ECDSA P-256/P-384 o RSA de 2048 a 8192 bits. Solo se usa su clave pública: su sujeto y sus extensiones se ignoran y los nombres salen de `hostnames`. | — |
| Validez (`validity_days`) | 7, 30, 90, 365, 730, 1095 o 5475 días. | 5475 (15 años) |

El certificado lleva los nombres como nombres alternativos DNS, el uso extendido de clave *serverAuth*, un número de serie aleatorio de 128 bits y, como nombre común, el primer nombre.

## La clave privada se muestra una sola vez

Cuando OpenWAF genera la clave, la devuelve **solo en la respuesta que emite el certificado**. OpenWAF no la guarda ni la escribe en ningún registro, tampoco en la auditoría. Guárdala en ese momento; si la pierdes, emite otro certificado y revoca el anterior.

Con una CSR no se genera ninguna clave privada y la tuya nunca sale de tu servidor. Es la opción más segura.

## Emitir un certificado

Necesitas el rol `tech` o `admin`; `readonly` puede ver la lista.

**Panel**

1. Ve a **SSL/TLS › Origen › Certificados de origen** y pulsa **Crear certificado**.
2. Escribe los nombres, uno por línea.
3. En **Clave privada**, elige **Generar una clave ECDSA P-256 (recomendado)**, **Generar una clave RSA 2048** o **Usar mi propia CSR**, y escoge la **Validez**.
4. Pulsa **Crear** y copia o descarga el certificado y la clave. No se pueden volver a mostrar.

**CLI**

```sh
# Clave generada por OpenWAF, escrita en un fichero 0600 y nunca impresa:
openwaf-cloud ctl origin-certs create example.com example.com '*.example.com' \
  --cert-out origin.pem --key-out origin.key --reason "certificado del origen"

# Clave RSA, válida un año:
openwaf-cloud ctl origin-certs create example.com www.example.com --key-type rsa --days 365 \
  --cert-out origin.pem --key-out origin.key --reason "certificado del origen"

# Con una CSR: la clave se queda en tu servidor.
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:P-256 -nodes \
  -keyout origin.key -out origin.csr -subj "/CN=example.com"
openwaf-cloud ctl origin-certs create example.com example.com '*.example.com' --csr origin.csr \
  --cert-out origin.pem --reason "certificado del origen"
```

`--cert-out` recibe el certificado seguido del certificado de la Origin CA. Los ficheros existentes nunca se sobrescriben. Como todo cambio, la orden simula primero y pide confirmación (`--yes` sin terminal; `--dry-run` solo comprueba).

**API**

```sh
curl -s -X POST https://dash.openwaf.dev/v1/orgs/$ORG/zones/$ZONE/origin-certs \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Change-Reason: certificado del origen" \
  -d '{"hostnames": ["example.com", "*.example.com"], "key_type": "ecdsa_p256", "validity_days": 5475}'
```

La respuesta es un `201` con `certificate` (sus metadatos), `certificate_pem`, `private_key_pem` (no aparece con `csr`) y `ca_pem`, enviada con `Cache-Control: no-store`. Añade `?dry_run=1` para validar sin emitir. Los errores de validación son un `422` con `code` `invalid` y el `field` afectado (`hostnames`, `key_type`, `validity_days` o `csr`).

**MCP**

`create_origin_cert` funciona en dos pasos: `confirm=false` comprueba la petición y `confirm=true` emite. Mejor pasa una `csr`, así ninguna clave privada pasa por la conversación.

```json
{"zone": "example.com", "hostnames": ["example.com", "*.example.com"], "csr": "-----BEGIN CERTIFICATE REQUEST-----\n…", "reason": "certificado del origen", "confirm": false}
```


Después: [instala el certificado en tu servidor](https://developers.openwaf.dev/es/ssl/install-origin-certificate/).

## Ver los certificados

Cada certificado tiene un `status` (`active`, `revoked` o `expired`), además de sus nombres, tipo de clave, número de serie, huella SHA-256 y validez. Las claves nunca se incluyen.

**Panel**

**SSL/TLS › Origen › Certificados de origen**.

**CLI**

```sh
openwaf-cloud ctl origin-certs list example.com
```

**API**

```sh
curl -s https://dash.openwaf.dev/v1/orgs/$ORG/zones/$ZONE/origin-certs \
  -H "Authorization: Bearer $OPENWAF_TOKEN"
```

**MCP**

`list_origin_certs` con `{"zone": "example.com"}`.


## Revocar un certificado

Revoca un certificado cuya clave pueda haberse filtrado o que ya no uses. Los nodos del borde reciben la revocación con su siguiente configuración, normalmente en menos de un minuto, y desde entonces lo rechazan en Full (strict): un origen que siga sirviéndolo responderá `526`. La revocación no se puede deshacer; emite otro certificado. El certificado sigue en la lista con `status` `revoked`, quién lo revocó y cuándo.

**Panel**

En **SSL/TLS › Origen › Certificados de origen**, pulsa **Revocar** en el certificado y confirma.

**CLI**

```sh
openwaf-cloud ctl origin-certs revoke example.com <id> --reason "clave filtrada"
```

**API**

```sh
curl -s -X DELETE https://dash.openwaf.dev/v1/orgs/$ORG/zones/$ZONE/origin-certs/$CERT_ID \
  -H "Authorization: Bearer $OPENWAF_TOKEN" \
  -H "X-Change-Reason: clave filtrada"
```

La llamada es idempotente. Un certificado de otra zona u organización responde `404`.

**MCP**

`revoke_origin_cert` con el `id` del certificado que devuelve `list_origin_certs`: `confirm=false` muestra el certificado y `confirm=true` lo revoca.


Los certificados de una **zona borrada** cuentan como revocados, aunque otra organización añada después el mismo dominio.

## Descargar el certificado de la Origin CA

El certificado de la Origin CA es público. No lo necesitas en un servidor que solo habla con el borde de OpenWAF, pero algunas herramientas piden la cadena completa:

```sh
curl -fsS https://dash.openwaf.dev/v1/origin-tls/origin-ca.pem -o openwaf-origin-ca.pem
# o bien
openwaf-cloud ctl origin-tls ca
```

La URL devuelve todos los certificados de la Origin CA que no han caducado; durante una rotación hay más de uno.

## Auditoría e historial

Emitir y revocar quedan en la auditoría de la organización (`zone.origin_cert.issue`, `zone.origin_cert.revoke`) con los nombres, el número de serie y el motivo. Los certificados de origen viven en tu servidor, no en la configuración de la zona, así que no crean versiones de la zona y revertir una versión no les afecta.
