> ## Documentation Index
> Fetch the complete documentation index at: https://certplane.kippel.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Providers de secretos

> Resuelve las credenciales del proveedor DNS referenciadas por los perfiles desde variables de entorno, archivos, Vault u OpenBao.

El broker resuelve la cadena `acme.credentials` de cada perfil a través de un provider de secretos enchufable. Se selecciona con `secrets.provider` en `broker.yml`.

| Provider  | Cuándo usarlo                                                                      |
| --------- | ---------------------------------------------------------------------------------- |
| `env`     | Broker único; credenciales en variables de entorno.                                |
| `file`    | Credenciales en el filesystem del broker (p. ej. archivo renderizado por Ansible). |
| `vault`   | HashiCorp Vault KV.                                                                |
| `openbao` | OpenBao KV (mismo protocolo que Vault).                                            |

## `env` (por defecto)

```yaml theme={null}
secrets:
  provider: env
```

La cadena `acme.credentials` se trata como nombre de variable de entorno:

```bash theme={null}
CLOUDFLARE_DNS_API_TOKEN=... certplane-broker -c /etc/certplane/broker.yml serve
```

En systemd:

```ini /etc/systemd/system/certplane-broker.service.d/env.conf theme={null}
[Service]
Environment=CLOUDFLARE_DNS_API_TOKEN=cf-token-aqui
```

## `file`

```yaml theme={null}
secrets:
  provider: file
```

La cadena `acme.credentials` se interpreta como ruta de archivo. El broker lee el contenido, lo recorta y lo usa como secreto. El archivo debe ser legible por el usuario `certplane`.

```bash theme={null}
install -m 0600 -o certplane -g certplane cf.token /etc/certplane/secrets/cloudflare
```

```yaml policy.yml theme={null}
profiles:
  public_edge_main:
    type: wildcard
    dns_names: ["*.example.com"]
    acme:
      challenge: dns-01
      credentials: /etc/certplane/secrets/cloudflare
```

## `vault` / `openbao`

```yaml theme={null}
secrets:
  provider: vault         # o openbao
  vault:
    address: https://vault.int.example.com:8200
    token_file: /etc/certplane/vault-token
    mount_path: secret
    kv_version: 2
    key: value
    timeout: 10s
    namespace: ""
```

| Campo        | Por defecto | Notas                                    |
| ------------ | ----------- | ---------------------------------------- |
| `address`    | —           | **Obligatorio** con `vault` u `openbao`. |
| `token`      | —           | Token inline. Evítalo.                   |
| `token_file` | —           | Archivo con el token. Preferido.         |
| `mount_path` | `secret`    | Mount del KV.                            |
| `kv_version` | `2`         | `1` o `2`.                               |
| `key`        | `value`     | Clave dentro del JSON del secreto.       |
| `timeout`    | `10s`       |                                          |
| `namespace`  | —           | Solo Vault Enterprise.                   |

`acme.credentials` nombra la ruta en Vault **relativa a `mount_path`**. Con `mount_path: secret` y `kv_version: 2`:

```yaml policy.yml theme={null}
profiles:
  public_edge_main:
    type: wildcard
    dns_names: ["*.example.com"]
    acme:
      challenge: dns-01
      credentials: certplane/cloudflare/example-com
```

…lee `secret/data/certplane/cloudflare/example-com` y devuelve el valor en `data.value` (o lo que diga `vault.key`).

Tutorial completo: [Secretos en Vault y OpenBao](/es/guides/vault-secrets).

## Cómo elegir

* **¿Solo arrancando?** `env`. Dos segundos.
* **¿Producción single-broker?** `file` está bien si ya renderizas con tu config-management.
* **¿Multi-broker o rotación centralizada?** `vault` u `openbao`.
